// Copyright 2024 Google LLC.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated file. DO NOT EDIT.

// Package searchads360 provides access to the Search Ads 360 Reporting API.
//
// For product documentation, see: https://developers.google.com/search-ads/reporting
//
// # Library status
//
// These client libraries are officially supported by Google. However, this
// library is considered complete and is in maintenance mode. This means
// that we will address critical bugs and security issues but will not add
// any new features.
//
// When possible, we recommend using our newer
// [Cloud Client Libraries for Go](https://pkg.go.dev/cloud.google.com/go)
// that are still actively being worked and iterated on.
//
// # Creating a client
//
// Usage example:
//
//	import "google.golang.org/api/searchads360/v0"
//	...
//	ctx := context.Background()
//	searchads360Service, err := searchads360.NewService(ctx)
//
// In this example, Google Application Default Credentials are used for
// authentication. For information on how to create and obtain Application
// Default Credentials, see https://developers.google.com/identity/protocols/application-default-credentials.
//
// # Other authentication options
//
// To use an API key for authentication (note: some APIs do not support API
// keys), use [google.golang.org/api/option.WithAPIKey]:
//
//	searchads360Service, err := searchads360.NewService(ctx, option.WithAPIKey("AIza..."))
//
// To use an OAuth token (e.g., a user token obtained via a three-legged OAuth
// flow, use [google.golang.org/api/option.WithTokenSource]:
//
//	config := &oauth2.Config{...}
//	// ...
//	token, err := config.Exchange(ctx, ...)
//	searchads360Service, err := searchads360.NewService(ctx, option.WithTokenSource(config.TokenSource(ctx, token)))
//
// See [google.golang.org/api/option.ClientOption] for details on options.
package searchads360 // import "google.golang.org/api/searchads360/v0"

import (
	"bytes"
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"strconv"
	"strings"

	googleapi "google.golang.org/api/googleapi"
	internal "google.golang.org/api/internal"
	gensupport "google.golang.org/api/internal/gensupport"
	option "google.golang.org/api/option"
	internaloption "google.golang.org/api/option/internaloption"
	htransport "google.golang.org/api/transport/http"
)

// Always reference these packages, just in case the auto-generated code
// below doesn't.
var _ = bytes.NewBuffer
var _ = strconv.Itoa
var _ = fmt.Sprintf
var _ = json.NewDecoder
var _ = io.Copy
var _ = url.Parse
var _ = gensupport.MarshalJSON
var _ = googleapi.Version
var _ = errors.New
var _ = strings.Replace
var _ = context.Canceled
var _ = internaloption.WithDefaultEndpoint
var _ = internal.Version

const apiId = "searchads360:v0"
const apiName = "searchads360"
const apiVersion = "v0"
const basePath = "https://searchads360.googleapis.com/"
const basePathTemplate = "https://searchads360.UNIVERSE_DOMAIN/"
const mtlsBasePath = "https://searchads360.mtls.googleapis.com/"

// OAuth2 scopes used by this API.
const (
	// View and manage your advertising data in DoubleClick Search
	DoubleclicksearchScope = "https://www.googleapis.com/auth/doubleclicksearch"
)

// NewService creates a new Service.
func NewService(ctx context.Context, opts ...option.ClientOption) (*Service, error) {
	scopesOption := internaloption.WithDefaultScopes(
		"https://www.googleapis.com/auth/doubleclicksearch",
	)
	// NOTE: prepend, so we don't override user-specified scopes.
	opts = append([]option.ClientOption{scopesOption}, opts...)
	opts = append(opts, internaloption.WithDefaultEndpoint(basePath))
	opts = append(opts, internaloption.WithDefaultEndpointTemplate(basePathTemplate))
	opts = append(opts, internaloption.WithDefaultMTLSEndpoint(mtlsBasePath))
	opts = append(opts, internaloption.EnableNewAuthLibrary())
	client, endpoint, err := htransport.NewClient(ctx, opts...)
	if err != nil {
		return nil, err
	}
	s, err := New(client)
	if err != nil {
		return nil, err
	}
	if endpoint != "" {
		s.BasePath = endpoint
	}
	return s, nil
}

// New creates a new Service. It uses the provided http.Client for requests.
//
// Deprecated: please use NewService instead.
// To provide a custom HTTP client, use option.WithHTTPClient.
// If you are using google.golang.org/api/googleapis/transport.APIKey, use option.WithAPIKey with NewService instead.
func New(client *http.Client) (*Service, error) {
	if client == nil {
		return nil, errors.New("client is nil")
	}
	s := &Service{client: client, BasePath: basePath}
	s.Customers = NewCustomersService(s)
	s.SearchAds360Fields = NewSearchAds360FieldsService(s)
	return s, nil
}

type Service struct {
	client    *http.Client
	BasePath  string // API endpoint base URL
	UserAgent string // optional additional User-Agent fragment

	Customers *CustomersService

	SearchAds360Fields *SearchAds360FieldsService
}

func (s *Service) userAgent() string {
	if s.UserAgent == "" {
		return googleapi.UserAgent
	}
	return googleapi.UserAgent + " " + s.UserAgent
}

func NewCustomersService(s *Service) *CustomersService {
	rs := &CustomersService{s: s}
	rs.CustomColumns = NewCustomersCustomColumnsService(s)
	rs.SearchAds360 = NewCustomersSearchAds360Service(s)
	return rs
}

type CustomersService struct {
	s *Service

	CustomColumns *CustomersCustomColumnsService

	SearchAds360 *CustomersSearchAds360Service
}

func NewCustomersCustomColumnsService(s *Service) *CustomersCustomColumnsService {
	rs := &CustomersCustomColumnsService{s: s}
	return rs
}

type CustomersCustomColumnsService struct {
	s *Service
}

func NewCustomersSearchAds360Service(s *Service) *CustomersSearchAds360Service {
	rs := &CustomersSearchAds360Service{s: s}
	return rs
}

type CustomersSearchAds360Service struct {
	s *Service
}

func NewSearchAds360FieldsService(s *Service) *SearchAds360FieldsService {
	rs := &SearchAds360FieldsService{s: s}
	return rs
}

type SearchAds360FieldsService struct {
	s *Service
}

// GoogleAdsSearchads360V0Common__AdScheduleInfo: 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 GoogleAdsSearchads360V0Common__AdScheduleInfo struct {
	// DayOfWeek: Day of the week the schedule applies to. This field is required
	// for CREATE operations and is prohibited on UPDATE operations.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - The value is unknown in this version.
	//   "MONDAY" - Monday.
	//   "TUESDAY" - Tuesday.
	//   "WEDNESDAY" - Wednesday.
	//   "THURSDAY" - Thursday.
	//   "FRIDAY" - Friday.
	//   "SATURDAY" - Saturday.
	//   "SUNDAY" - Sunday.
	DayOfWeek string `json:"dayOfWeek,omitempty"`
	// EndHour: 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 int64 `json:"endHour,omitempty"`
	// EndMinute: 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.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - The value is unknown in this version.
	//   "ZERO" - Zero minutes past the hour.
	//   "FIFTEEN" - Fifteen minutes past the hour.
	//   "THIRTY" - Thirty minutes past the hour.
	//   "FORTY_FIVE" - Forty-five minutes past the hour.
	EndMinute string `json:"endMinute,omitempty"`
	// StartHour: 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 int64 `json:"startHour,omitempty"`
	// StartMinute: Minutes after the start hour at which this schedule starts.
	// This field is required for CREATE operations and is prohibited on UPDATE
	// operations.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - The value is unknown in this version.
	//   "ZERO" - Zero minutes past the hour.
	//   "FIFTEEN" - Fifteen minutes past the hour.
	//   "THIRTY" - Thirty minutes past the hour.
	//   "FORTY_FIVE" - Forty-five minutes past the hour.
	StartMinute string `json:"startMinute,omitempty"`
	// ForceSendFields is a list of field names (e.g. "DayOfWeek") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "DayOfWeek") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__AdScheduleInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__AdScheduleInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__AgeRangeInfo: An age range criterion.
type GoogleAdsSearchads360V0Common__AgeRangeInfo struct {
	// Type: Type of the age range.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "AGE_RANGE_18_24" - Between 18 and 24 years old.
	//   "AGE_RANGE_25_34" - Between 25 and 34 years old.
	//   "AGE_RANGE_35_44" - Between 35 and 44 years old.
	//   "AGE_RANGE_45_54" - Between 45 and 54 years old.
	//   "AGE_RANGE_55_64" - Between 55 and 64 years old.
	//   "AGE_RANGE_65_UP" - 65 years old and beyond.
	//   "AGE_RANGE_UNDETERMINED" - Undetermined age range.
	Type string `json:"type,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Type") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Type") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__AgeRangeInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__AgeRangeInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__AssetInteractionTarget: An
// AssetInteractionTarget segment.
type GoogleAdsSearchads360V0Common__AssetInteractionTarget struct {
	// Asset: The asset resource name.
	Asset string `json:"asset,omitempty"`
	// InteractionOnThisAsset: Only used with CustomerAsset, CampaignAsset and
	// AdGroupAsset metrics. Indicates whether the interaction metrics occurred on
	// the asset itself or a different asset or ad unit.
	InteractionOnThisAsset bool `json:"interactionOnThisAsset,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Asset") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Asset") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__AssetInteractionTarget) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__AssetInteractionTarget
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__AssetUsage: Contains the usage information of
// the asset.
type GoogleAdsSearchads360V0Common__AssetUsage struct {
	// Asset: Resource name of the asset.
	Asset string `json:"asset,omitempty"`
	// ServedAssetFieldType: The served field type of the asset.
	//
	// Possible values:
	//   "UNSPECIFIED" - No value has been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "HEADLINE_1" - The asset is used in headline 1.
	//   "HEADLINE_2" - The asset is used in headline 2.
	//   "HEADLINE_3" - The asset is used in headline 3.
	//   "DESCRIPTION_1" - The asset is used in description 1.
	//   "DESCRIPTION_2" - The asset is used in description 2.
	//   "HEADLINE" - The asset was used in a headline. Use this only if there is
	// only one headline in the ad. Otherwise, use the HEADLINE_1, HEADLINE_2 or
	// HEADLINE_3 enums
	//   "HEADLINE_IN_PORTRAIT" - The asset was used as a headline in portrait
	// image.
	//   "LONG_HEADLINE" - The asset was used in a long headline (used in
	// MultiAssetResponsiveAd).
	//   "DESCRIPTION" - The asset was used in a description. Use this only if
	// there is only one description in the ad. Otherwise, use the DESCRIPTION_1 or
	// DESCRIPTION_@ enums
	//   "DESCRIPTION_IN_PORTRAIT" - The asset was used as description in portrait
	// image.
	//   "BUSINESS_NAME_IN_PORTRAIT" - The asset was used as business name in
	// portrait image.
	//   "BUSINESS_NAME" - The asset was used as business name.
	//   "MARKETING_IMAGE" - The asset was used as a marketing image.
	//   "MARKETING_IMAGE_IN_PORTRAIT" - The asset was used as a marketing image in
	// portrait image.
	//   "SQUARE_MARKETING_IMAGE" - The asset was used as a square marketing image.
	//   "PORTRAIT_MARKETING_IMAGE" - The asset was used as a portrait marketing
	// image.
	//   "LOGO" - The asset was used as a logo.
	//   "LANDSCAPE_LOGO" - The asset was used as a landscape logo.
	//   "CALL_TO_ACTION" - The asset was used as a call-to-action.
	//   "YOU_TUBE_VIDEO" - The asset was used as a YouTube video.
	//   "SITELINK" - This asset is used as a sitelink.
	//   "CALL" - This asset is used as a call.
	//   "MOBILE_APP" - This asset is used as a mobile app.
	//   "CALLOUT" - This asset is used as a callout.
	//   "STRUCTURED_SNIPPET" - This asset is used as a structured snippet.
	//   "PRICE" - This asset is used as a price.
	//   "PROMOTION" - This asset is used as a promotion.
	//   "AD_IMAGE" - This asset is used as an image.
	//   "LEAD_FORM" - The asset is used as a lead form.
	//   "BUSINESS_LOGO" - The asset is used as a business logo.
	ServedAssetFieldType string `json:"servedAssetFieldType,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Asset") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Asset") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__AssetUsage) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__AssetUsage
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__AudienceInfo: An audience criterion.
type GoogleAdsSearchads360V0Common__AudienceInfo struct {
	// Audience: The Audience resource name.
	Audience string `json:"audience,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Audience") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Audience") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__AudienceInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__AudienceInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__BusinessProfileLocation: Business Profile
// location data synced from the linked Business Profile account.
type GoogleAdsSearchads360V0Common__BusinessProfileLocation struct {
	// Labels: Advertiser specified label for the location on the Business Profile
	// account. This is synced from the Business Profile account.
	Labels []string `json:"labels,omitempty"`
	// ListingId: Listing ID of this Business Profile location. This is synced from
	// the linked Business Profile account.
	ListingId int64 `json:"listingId,omitempty,string"`
	// StoreCode: Business Profile store code of this location. This is synced from
	// the Business Profile account.
	StoreCode string `json:"storeCode,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Labels") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Labels") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__BusinessProfileLocation) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__BusinessProfileLocation
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__CallToActionAsset: A call to action asset.
type GoogleAdsSearchads360V0Common__CallToActionAsset struct {
	// CallToAction: Call to action.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "LEARN_MORE" - The call to action type is learn more.
	//   "GET_QUOTE" - The call to action type is get quote.
	//   "APPLY_NOW" - The call to action type is apply now.
	//   "SIGN_UP" - The call to action type is sign up.
	//   "CONTACT_US" - The call to action type is contact us.
	//   "SUBSCRIBE" - The call to action type is subscribe.
	//   "DOWNLOAD" - The call to action type is download.
	//   "BOOK_NOW" - The call to action type is book now.
	//   "SHOP_NOW" - The call to action type is shop now.
	//   "BUY_NOW" - The call to action type is buy now.
	//   "DONATE_NOW" - The call to action type is donate now.
	//   "ORDER_NOW" - The call to action type is order now.
	//   "PLAY_NOW" - The call to action type is play now.
	//   "SEE_MORE" - The call to action type is see more.
	//   "START_NOW" - The call to action type is start now.
	//   "VISIT_SITE" - The call to action type is visit site.
	//   "WATCH_NOW" - The call to action type is watch now.
	CallToAction string `json:"callToAction,omitempty"`
	// ForceSendFields is a list of field names (e.g. "CallToAction") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CallToAction") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__CallToActionAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__CallToActionAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__CustomParameter: A mapping that can be used
// by custom parameter tags in a `tracking_url_template`, `final_urls`, or
// `mobile_final_urls`.
type GoogleAdsSearchads360V0Common__CustomParameter struct {
	// Key: The key matching the parameter tag name.
	Key string `json:"key,omitempty"`
	// Value: The value to be substituted.
	Value string `json:"value,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Key") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Key") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__CustomParameter) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__CustomParameter
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__DeviceInfo: A device criterion.
type GoogleAdsSearchads360V0Common__DeviceInfo struct {
	// Type: Type of the device.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - The value is unknown in this version.
	//   "MOBILE" - Mobile devices with full browsers.
	//   "TABLET" - Tablets with full browsers.
	//   "DESKTOP" - Computers.
	//   "CONNECTED_TV" - Smart TVs and game consoles.
	//   "OTHER" - Other device types.
	Type string `json:"type,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Type") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Type") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__DeviceInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__DeviceInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__EnhancedCpc: 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. This bidding
// strategy is deprecated and cannot be created anymore. Use ManualCpc with
// enhanced_cpc_enabled set to true for equivalent functionality.
type GoogleAdsSearchads360V0Common__EnhancedCpc struct {
}

// GoogleAdsSearchads360V0Common__FrequencyCapEntry: 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 GoogleAdsSearchads360V0Common__FrequencyCapEntry struct {
}

// GoogleAdsSearchads360V0Common__GenderInfo: A gender criterion.
type GoogleAdsSearchads360V0Common__GenderInfo struct {
	// Type: Type of the gender.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "MALE" - Male.
	//   "FEMALE" - Female.
	//   "UNDETERMINED" - Undetermined gender.
	Type string `json:"type,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Type") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Type") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__GenderInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__GenderInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__ImageAsset: An Image asset.
type GoogleAdsSearchads360V0Common__ImageAsset struct {
	// FileSize: File size of the image asset in bytes.
	FileSize int64 `json:"fileSize,omitempty,string"`
	// FullSize: Metadata for this image at its original size.
	FullSize *GoogleAdsSearchads360V0Common__ImageDimension `json:"fullSize,omitempty"`
	// MimeType: MIME type of the image asset.
	//
	// Possible values:
	//   "UNSPECIFIED" - The mime type has not been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "IMAGE_JPEG" - MIME type of image/jpeg.
	//   "IMAGE_GIF" - MIME type of image/gif.
	//   "IMAGE_PNG" - MIME type of image/png.
	//   "FLASH" - MIME type of application/x-shockwave-flash.
	//   "TEXT_HTML" - MIME type of text/html.
	//   "PDF" - MIME type of application/pdf.
	//   "MSWORD" - MIME type of application/msword.
	//   "MSEXCEL" - MIME type of application/vnd.ms-excel.
	//   "RTF" - MIME type of application/rtf.
	//   "AUDIO_WAV" - MIME type of audio/wav.
	//   "AUDIO_MP3" - MIME type of audio/mp3.
	//   "HTML5_AD_ZIP" - MIME type of application/x-html5-ad-zip.
	MimeType string `json:"mimeType,omitempty"`
	// ForceSendFields is a list of field names (e.g. "FileSize") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "FileSize") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__ImageAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__ImageAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__ImageDimension: Metadata for an image at a
// certain size, either original or resized.
type GoogleAdsSearchads360V0Common__ImageDimension struct {
	// HeightPixels: Height of the image.
	HeightPixels int64 `json:"heightPixels,omitempty,string"`
	// Url: A URL that returns the image with this height and width.
	Url string `json:"url,omitempty"`
	// WidthPixels: Width of the image.
	WidthPixels int64 `json:"widthPixels,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "HeightPixels") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "HeightPixels") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__ImageDimension) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__ImageDimension
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__Keyword: A Keyword criterion segment.
type GoogleAdsSearchads360V0Common__Keyword struct {
	// AdGroupCriterion: The AdGroupCriterion resource name.
	AdGroupCriterion string `json:"adGroupCriterion,omitempty"`
	// Info: Keyword info.
	Info *GoogleAdsSearchads360V0Common__KeywordInfo `json:"info,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdGroupCriterion") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdGroupCriterion") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__Keyword) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__Keyword
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__KeywordInfo: A keyword criterion.
type GoogleAdsSearchads360V0Common__KeywordInfo struct {
	// MatchType: The match type of the keyword.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "EXACT" - Exact match.
	//   "PHRASE" - Phrase match.
	//   "BROAD" - Broad match.
	MatchType string `json:"matchType,omitempty"`
	// Text: The text of the keyword (at most 80 characters and 10 words).
	Text string `json:"text,omitempty"`
	// ForceSendFields is a list of field names (e.g. "MatchType") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "MatchType") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__KeywordInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__KeywordInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__LanguageInfo: A language criterion.
type GoogleAdsSearchads360V0Common__LanguageInfo struct {
	// LanguageConstant: The language constant resource name.
	LanguageConstant string `json:"languageConstant,omitempty"`
	// ForceSendFields is a list of field names (e.g. "LanguageConstant") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "LanguageConstant") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__LanguageInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__LanguageInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__ListingGroupInfo: A listing group criterion.
type GoogleAdsSearchads360V0Common__ListingGroupInfo struct {
	// Type: Type of the listing group.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "SUBDIVISION" - 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.
	//   "UNIT" - Listing group unit that defines a bid.
	Type string `json:"type,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Type") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Type") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__ListingGroupInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__ListingGroupInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__LocationGroupInfo: A radius around a list of
// locations specified through a feed.
type GoogleAdsSearchads360V0Common__LocationGroupInfo struct {
	// FeedItemSets: FeedItemSets whose FeedItems are targeted. If multiple IDs are
	// specified, then all items that appear in at least one set are targeted. This
	// field cannot be used with geo_target_constants. This is optional and can
	// only be set in CREATE operations.
	FeedItemSets []string `json:"feedItemSets,omitempty"`
	// GeoTargetConstants: Geo target constant(s) restricting the scope of the
	// geographic area within the feed. Currently only one geo target constant is
	// allowed.
	GeoTargetConstants []string `json:"geoTargetConstants,omitempty"`
	// Radius: Distance in units specifying the radius around targeted locations.
	// This is required and must be set in CREATE operations.
	Radius int64 `json:"radius,omitempty,string"`
	// RadiusUnits: Unit of the radius. Miles and meters are supported for geo
	// target constants. Milli miles and meters are supported for feed item sets.
	// This is required and must be set in CREATE operations.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "METERS" - Meters
	//   "MILES" - Miles
	//   "MILLI_MILES" - Milli Miles
	RadiusUnits string `json:"radiusUnits,omitempty"`
	// ForceSendFields is a list of field names (e.g. "FeedItemSets") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "FeedItemSets") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__LocationGroupInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__LocationGroupInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__LocationInfo: A location criterion.
type GoogleAdsSearchads360V0Common__LocationInfo struct {
	// GeoTargetConstant: The geo target constant resource name.
	GeoTargetConstant string `json:"geoTargetConstant,omitempty"`
	// ForceSendFields is a list of field names (e.g. "GeoTargetConstant") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "GeoTargetConstant") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__LocationInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__LocationInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__ManualCpa: Manual bidding strategy that
// allows advertiser to set the bid per advertiser-specified action.
type GoogleAdsSearchads360V0Common__ManualCpa struct {
}

// GoogleAdsSearchads360V0Common__ManualCpc: Manual click-based bidding where
// user pays per click.
type GoogleAdsSearchads360V0Common__ManualCpc struct {
	// EnhancedCpcEnabled: Whether bids are to be enhanced based on conversion
	// optimizer data.
	EnhancedCpcEnabled bool `json:"enhancedCpcEnabled,omitempty"`
	// ForceSendFields is a list of field names (e.g. "EnhancedCpcEnabled") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "EnhancedCpcEnabled") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__ManualCpc) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__ManualCpc
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__ManualCpm: Manual impression-based bidding
// where user pays per thousand impressions.
type GoogleAdsSearchads360V0Common__ManualCpm struct {
}

// GoogleAdsSearchads360V0Common__MaximizeConversionValue: An automated bidding
// strategy to help get the most conversion value for your campaigns while
// spending your budget.
type GoogleAdsSearchads360V0Common__MaximizeConversionValue struct {
	// CpcBidCeilingMicros: Maximum bid limit that can be set by the bid strategy.
	// The limit applies to all keywords managed by the strategy. Mutable for
	// portfolio bidding strategies only.
	CpcBidCeilingMicros int64 `json:"cpcBidCeilingMicros,omitempty,string"`
	// CpcBidFloorMicros: Minimum bid limit that can be set by the bid strategy.
	// The limit applies to all keywords managed by the strategy. Mutable for
	// portfolio bidding strategies only.
	CpcBidFloorMicros int64 `json:"cpcBidFloorMicros,omitempty,string"`
	// TargetRoas: 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 float64 `json:"targetRoas,omitempty"`
	// ForceSendFields is a list of field names (e.g. "CpcBidCeilingMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CpcBidCeilingMicros") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__MaximizeConversionValue) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__MaximizeConversionValue
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

func (s *GoogleAdsSearchads360V0Common__MaximizeConversionValue) UnmarshalJSON(data []byte) error {
	type NoMethod GoogleAdsSearchads360V0Common__MaximizeConversionValue
	var s1 struct {
		TargetRoas gensupport.JSONFloat64 `json:"targetRoas"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.TargetRoas = float64(s1.TargetRoas)
	return nil
}

// GoogleAdsSearchads360V0Common__MaximizeConversions: An automated bidding
// strategy to help get the most conversions for your campaigns while spending
// your budget.
type GoogleAdsSearchads360V0Common__MaximizeConversions struct {
	// CpcBidCeilingMicros: Maximum bid limit that can be set by the bid strategy.
	// The limit applies to all keywords managed by the strategy. Mutable for
	// portfolio bidding strategies only.
	CpcBidCeilingMicros int64 `json:"cpcBidCeilingMicros,omitempty,string"`
	// CpcBidFloorMicros: Minimum bid limit that can be set by the bid strategy.
	// The limit applies to all keywords managed by the strategy. Mutable for
	// portfolio bidding strategies only.
	CpcBidFloorMicros int64 `json:"cpcBidFloorMicros,omitempty,string"`
	// TargetCpaMicros: The target cost-per-action (CPA) option. This is the
	// average amount that you would like to spend per conversion action specified
	// in micro units of the bidding strategy's currency. If set, the bid strategy
	// will get as many conversions as possible at or below the target
	// cost-per-action. If the target CPA is not set, the bid strategy will aim to
	// achieve the lowest possible CPA given the budget.
	TargetCpaMicros int64 `json:"targetCpaMicros,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "CpcBidCeilingMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CpcBidCeilingMicros") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__MaximizeConversions) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__MaximizeConversions
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__Metrics: Metrics data.
type GoogleAdsSearchads360V0Common__Metrics struct {
	// AbsoluteTopImpressionPercentage: Search absolute top impression share is the
	// percentage of your Search ad impressions that are shown in the most
	// prominent Search position.
	AbsoluteTopImpressionPercentage float64 `json:"absoluteTopImpressionPercentage,omitempty"`
	// AllConversions: The total number of conversions. This includes all
	// conversions regardless of the value of include_in_conversions_metric.
	AllConversions float64 `json:"allConversions,omitempty"`
	// AllConversionsByConversionDate: The total number of conversions. This
	// includes all conversions regardless of the value of
	// include_in_conversions_metric. When this column is selected with date, the
	// values in date column means the conversion date. Details for the
	// by_conversion_date columns are available at
	// https://support.google.com/sa360/answer/9250611.
	AllConversionsByConversionDate float64 `json:"allConversionsByConversionDate,omitempty"`
	// AllConversionsFromClickToCall: 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 float64 `json:"allConversionsFromClickToCall,omitempty"`
	// AllConversionsFromDirections: 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 float64 `json:"allConversionsFromDirections,omitempty"`
	// AllConversionsFromInteractionsRate: All conversions from interactions (as
	// oppose to view through conversions) divided by the number of ad
	// interactions.
	AllConversionsFromInteractionsRate float64 `json:"allConversionsFromInteractionsRate,omitempty"`
	// AllConversionsFromInteractionsValuePerInteraction: The value of all
	// conversions from interactions divided by the total number of interactions.
	AllConversionsFromInteractionsValuePerInteraction float64 `json:"allConversionsFromInteractionsValuePerInteraction,omitempty"`
	// AllConversionsFromMenu: 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 float64 `json:"allConversionsFromMenu,omitempty"`
	// AllConversionsFromOrder: The number of times people placed an order at a
	// store after clicking an ad. This metric applies to feed items only.
	AllConversionsFromOrder float64 `json:"allConversionsFromOrder,omitempty"`
	// AllConversionsFromOtherEngagement: 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 float64 `json:"allConversionsFromOtherEngagement,omitempty"`
	// AllConversionsFromStoreVisit: Estimated number of times people visited a
	// store after clicking an ad. This metric applies to feed items only.
	AllConversionsFromStoreVisit float64 `json:"allConversionsFromStoreVisit,omitempty"`
	// AllConversionsFromStoreWebsite: 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 float64 `json:"allConversionsFromStoreWebsite,omitempty"`
	// AllConversionsValue: The value of all conversions.
	AllConversionsValue float64 `json:"allConversionsValue,omitempty"`
	// AllConversionsValueByConversionDate: The value of all conversions. When this
	// column is selected with date, the values in date column means the conversion
	// date. Details for the by_conversion_date columns are available at
	// https://support.google.com/sa360/answer/9250611.
	AllConversionsValueByConversionDate float64 `json:"allConversionsValueByConversionDate,omitempty"`
	// AllConversionsValuePerCost: 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 float64 `json:"allConversionsValuePerCost,omitempty"`
	// AverageCost: The average amount you pay per interaction. This amount is the
	// total cost of your ads divided by the total number of interactions.
	AverageCost float64 `json:"averageCost,omitempty"`
	// AverageCpc: The total cost of all clicks divided by the total number of
	// clicks received. This metric is a monetary value and returned in the
	// customer's currency by default. See the metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	AverageCpc float64 `json:"averageCpc,omitempty"`
	// AverageCpm: Average cost-per-thousand impressions (CPM). This metric is a
	// monetary value and returned in the customer's currency by default. See the
	// metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	AverageCpm float64 `json:"averageCpm,omitempty"`
	// Clicks: The number of clicks.
	Clicks int64 `json:"clicks,omitempty,string"`
	// ClientAccountConversions: The number of client account conversions. This
	// only includes conversion actions which
	// include_in_client_account_conversions_metric attribute is set to true. If
	// you use conversion-based bidding, your bid strategies will optimize for
	// these conversions.
	ClientAccountConversions float64 `json:"clientAccountConversions,omitempty"`
	// ClientAccountConversionsValue: The value of client account conversions. This
	// only includes conversion actions which
	// include_in_client_account_conversions_metric attribute is set to true. If
	// you use conversion-based bidding, your bid strategies will optimize for
	// these conversions.
	ClientAccountConversionsValue float64 `json:"clientAccountConversionsValue,omitempty"`
	// ClientAccountCrossSellCostOfGoodsSoldMicros: Client account cross-sell cost
	// of goods sold (COGS) is the total cost of products sold as a result of
	// advertising a different product. How it works: You report conversions with
	// cart data for completed purchases on your website. If the ad that was
	// interacted with before the purchase has an associated product (see Shopping
	// Ads) then this product is considered the advertised product. Any product
	// included in the order the customer places is a sold product. If these
	// products don't match then this is considered cross-sell. Cross-sell cost of
	// goods sold is the total cost of the products sold that weren't advertised.
	// Example: Someone clicked on a Shopping ad for a hat then bought the same hat
	// and a shirt. The hat has a cost of goods sold value of $3, the shirt has a
	// cost of goods sold value of $5. The cross-sell cost of goods sold for this
	// order is $5. This metric is only available if you report conversions with
	// cart data. This metric is a monetary value and returned in the customer's
	// currency by default. See the metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	ClientAccountCrossSellCostOfGoodsSoldMicros int64 `json:"clientAccountCrossSellCostOfGoodsSoldMicros,omitempty,string"`
	// ClientAccountCrossSellGrossProfitMicros: Client account cross-sell gross
	// profit is the profit you made from products sold as a result of advertising
	// a different product, minus cost of goods sold (COGS). How it works: You
	// report conversions with cart data for completed purchases on your website.
	// If the ad that was interacted with before the purchase has an associated
	// product (see Shopping Ads) then this product is considered the advertised
	// product. Any product included in the purchase is a sold product. If these
	// products don't match then this is considered cross-sell. Cross-sell gross
	// profit is the revenue you made from cross-sell attributed to your ads minus
	// the cost of the goods sold. Example: Someone clicked on a Shopping ad for a
	// hat then bought the same hat and a shirt. The shirt is priced $20 and has a
	// cost of goods sold value of $5. The cross-sell gross profit of this order is
	// $15 = $20 - $5. This metric is only available if you report conversions with
	// cart data. This metric is a monetary value and returned in the customer's
	// currency by default. See the metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	ClientAccountCrossSellGrossProfitMicros int64 `json:"clientAccountCrossSellGrossProfitMicros,omitempty,string"`
	// ClientAccountCrossSellRevenueMicros: Client account cross-sell revenue is
	// the total amount you made from products sold as a result of advertising a
	// different product. How it works: You report conversions with cart data for
	// completed purchases on your website. If the ad that was interacted with
	// before the purchase has an associated product (see Shopping Ads) then this
	// product is considered the advertised product. Any product included in the
	// order the customer places is a sold product. If these products don't match
	// then this is considered cross-sell. Cross-sell revenue is the total value
	// you made from cross-sell attributed to your ads. Example: Someone clicked on
	// a Shopping ad for a hat then bought the same hat and a shirt. The hat is
	// priced $10 and the shirt is priced $20. The cross-sell revenue of this order
	// is $20. This metric is only available if you report conversions with cart
	// data. This metric is a monetary value and returned in the customer's
	// currency by default. See the metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	ClientAccountCrossSellRevenueMicros int64 `json:"clientAccountCrossSellRevenueMicros,omitempty,string"`
	// ClientAccountCrossSellUnitsSold: Client account cross-sell units sold is the
	// total number of products sold as a result of advertising a different
	// product. How it works: You report conversions with cart data for completed
	// purchases on your website. If the ad that was interacted with before the
	// purchase has an associated product (see Shopping Ads) then this product is
	// considered the advertised product. Any product included in the order the
	// customer places is a sold product. If these products don't match then this
	// is considered cross-sell. Cross-sell units sold is the total number of
	// cross-sold products from all orders attributed to your ads. Example: Someone
	// clicked on a Shopping ad for a hat then bought the same hat, a shirt and a
	// jacket. The cross-sell units sold in this order is 2. This metric is only
	// available if you report conversions with cart data.
	ClientAccountCrossSellUnitsSold float64 `json:"clientAccountCrossSellUnitsSold,omitempty"`
	// ClientAccountLeadCostOfGoodsSoldMicros: Client account lead cost of goods
	// sold (COGS) is the total cost of products sold as a result of advertising
	// the same product. How it works: You report conversions with cart data for
	// completed purchases on your website. If the ad that was interacted with has
	// an associated product (see Shopping Ads) then this product is considered the
	// advertised product. Any product included in the order the customer places is
	// a sold product. If the advertised and sold products match, then the cost of
	// these goods is counted under lead cost of goods sold. Example: Someone
	// clicked on a Shopping ad for a hat then bought the same hat and a shirt. The
	// hat has a cost of goods sold value of $3, the shirt has a cost of goods sold
	// value of $5. The lead cost of goods sold for this order is $3. This metric
	// is only available if you report conversions with cart data. This metric is a
	// monetary value and returned in the customer's currency by default. See the
	// metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	ClientAccountLeadCostOfGoodsSoldMicros int64 `json:"clientAccountLeadCostOfGoodsSoldMicros,omitempty,string"`
	// ClientAccountLeadGrossProfitMicros: Client account lead gross profit is the
	// profit you made from products sold as a result of advertising the same
	// product, minus cost of goods sold (COGS). How it works: You report
	// conversions with cart data for completed purchases on your website. If the
	// ad that was interacted with before the purchase has an associated product
	// (see Shopping Ads) then this product is considered the advertised product.
	// Any product included in the order the customer places is a sold product. If
	// the advertised and sold products match, then the revenue you made from these
	// sales minus the cost of goods sold is your lead gross profit. Example:
	// Someone clicked on a Shopping ad for a hat then bought the same hat and a
	// shirt. The hat is priced $10 and has a cost of goods sold value of $3. The
	// lead gross profit of this order is $7 = $10 - $3. This metric is only
	// available if you report conversions with cart data. This metric is a
	// monetary value and returned in the customer's currency by default. See the
	// metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	ClientAccountLeadGrossProfitMicros int64 `json:"clientAccountLeadGrossProfitMicros,omitempty,string"`
	// ClientAccountLeadRevenueMicros: Client account lead revenue is the total
	// amount you made from products sold as a result of advertising the same
	// product. How it works: You report conversions with cart data for completed
	// purchases on your website. If the ad that was interacted with before the
	// purchase has an associated product (see Shopping Ads) then this product is
	// considered the advertised product. Any product included in the order the
	// customer places is a sold product. If the advertised and sold products
	// match, then the total value you made from the sales of these products is
	// shown under lead revenue. Example: Someone clicked on a Shopping ad for a
	// hat then bought the same hat and a shirt. The hat is priced $10 and the
	// shirt is priced $20. The lead revenue of this order is $10. This metric is
	// only available if you report conversions with cart data. This metric is a
	// monetary value and returned in the customer's currency by default. See the
	// metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	ClientAccountLeadRevenueMicros int64 `json:"clientAccountLeadRevenueMicros,omitempty,string"`
	// ClientAccountLeadUnitsSold: Client account lead units sold is the total
	// number of products sold as a result of advertising the same product. How it
	// works: You report conversions with cart data for completed purchases on your
	// website. If the ad that was interacted with before the purchase has an
	// associated product (see Shopping Ads) then this product is considered the
	// advertised product. Any product included in the order the customer places is
	// a sold product. If the advertised and sold products match, then the total
	// number of these products sold is shown under lead units sold. Example:
	// Someone clicked on a Shopping ad for a hat then bought the same hat, a shirt
	// and a jacket. The lead units sold in this order is 1. This metric is only
	// available if you report conversions with cart data.
	ClientAccountLeadUnitsSold float64 `json:"clientAccountLeadUnitsSold,omitempty"`
	// ClientAccountViewThroughConversions: 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 (for
	// example, clicking on) another ad.
	ClientAccountViewThroughConversions int64 `json:"clientAccountViewThroughConversions,omitempty,string"`
	// ContentBudgetLostImpressionShare: 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 float64 `json:"contentBudgetLostImpressionShare,omitempty"`
	// ContentImpressionShare: 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 float64 `json:"contentImpressionShare,omitempty"`
	// ContentRankLostImpressionShare: 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 float64 `json:"contentRankLostImpressionShare,omitempty"`
	// ConversionCustomMetrics: The conversion custom metrics.
	ConversionCustomMetrics []*GoogleAdsSearchads360V0Common__Value `json:"conversionCustomMetrics,omitempty"`
	// Conversions: The number of conversions. This only includes conversion
	// actions which include_in_conversions_metric attribute is set to true. If you
	// use conversion-based bidding, your bid strategies will optimize for these
	// conversions.
	Conversions float64 `json:"conversions,omitempty"`
	// ConversionsByConversionDate: The sum of conversions by conversion date for
	// biddable conversion types. Can be fractional due to attribution modeling.
	// When this column is selected with date, the values in date column means the
	// conversion date.
	ConversionsByConversionDate float64 `json:"conversionsByConversionDate,omitempty"`
	// ConversionsFromInteractionsRate: Average biddable conversions (from
	// interaction) per conversion eligible interaction. Shows how often, on
	// average, an ad interaction leads to a biddable conversion.
	ConversionsFromInteractionsRate float64 `json:"conversionsFromInteractionsRate,omitempty"`
	// ConversionsFromInteractionsValuePerInteraction: 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. If you use conversion-based bidding, your bid strategies will
	// optimize for these conversions.
	ConversionsFromInteractionsValuePerInteraction float64 `json:"conversionsFromInteractionsValuePerInteraction,omitempty"`
	// ConversionsValue: The sum of conversion values for the conversions included
	// in the "conversions" field. This metric is useful only if you entered a
	// value for your conversion actions.
	ConversionsValue float64 `json:"conversionsValue,omitempty"`
	// ConversionsValueByConversionDate: The sum of biddable conversions value by
	// conversion date. When this column is selected with date, the values in date
	// column means the conversion date.
	ConversionsValueByConversionDate float64 `json:"conversionsValueByConversionDate,omitempty"`
	// ConversionsValuePerCost: The value of biddable conversion divided by the
	// total cost of conversion eligible interactions.
	ConversionsValuePerCost float64 `json:"conversionsValuePerCost,omitempty"`
	// CostMicros: The sum of your cost-per-click (CPC) and cost-per-thousand
	// impressions (CPM) costs during this period. This metric is a monetary value
	// and returned in the customer's currency by default. See the metrics_currency
	// parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	CostMicros int64 `json:"costMicros,omitempty,string"`
	// CostPerAllConversions: The cost of ad interactions divided by all
	// conversions.
	CostPerAllConversions float64 `json:"costPerAllConversions,omitempty"`
	// CostPerConversion: Average conversion eligible cost per biddable conversion.
	CostPerConversion float64 `json:"costPerConversion,omitempty"`
	// CostPerCurrentModelAttributedConversion: 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. If you
	// use conversion-based bidding, your bid strategies will optimize for these
	// conversions.
	CostPerCurrentModelAttributedConversion float64 `json:"costPerCurrentModelAttributedConversion,omitempty"`
	// CrossDeviceConversions: Conversions from when a customer clicks on an ad on
	// one device, then converts on a different device or browser. Cross-device
	// conversions are already included in all_conversions.
	CrossDeviceConversions float64 `json:"crossDeviceConversions,omitempty"`
	// CrossDeviceConversionsValue: The sum of the value of cross-device
	// conversions.
	CrossDeviceConversionsValue float64 `json:"crossDeviceConversionsValue,omitempty"`
	// CrossSellCostOfGoodsSoldMicros: Cross-sell cost of goods sold (COGS) is the
	// total cost of products sold as a result of advertising a different product.
	// How it works: You report conversions with cart data for completed purchases
	// on your website. If the ad that was interacted with before the purchase has
	// an associated product (see Shopping Ads) then this product is considered the
	// advertised product. Any product included in the order the customer places is
	// a sold product. If these products don't match then this is considered
	// cross-sell. Cross-sell cost of goods sold is the total cost of the products
	// sold that weren't advertised. Example: Someone clicked on a Shopping ad for
	// a hat then bought the same hat and a shirt. The hat has a cost of goods sold
	// value of $3, the shirt has a cost of goods sold value of $5. The cross-sell
	// cost of goods sold for this order is $5. This metric is only available if
	// you report conversions with cart data. This metric is a monetary value and
	// returned in the customer's currency by default. See the metrics_currency
	// parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	CrossSellCostOfGoodsSoldMicros int64 `json:"crossSellCostOfGoodsSoldMicros,omitempty,string"`
	// CrossSellGrossProfitMicros: Cross-sell gross profit is the profit you made
	// from products sold as a result of advertising a different product, minus
	// cost of goods sold (COGS). How it works: You report conversions with cart
	// data for completed purchases on your website. If the ad that was interacted
	// with before the purchase has an associated product (see Shopping Ads) then
	// this product is considered the advertised product. Any product included in
	// the purchase is a sold product. If these products don't match then this is
	// considered cross-sell. Cross-sell gross profit is the revenue you made from
	// cross-sell attributed to your ads minus the cost of the goods sold. Example:
	// Someone clicked on a Shopping ad for a hat then bought the same hat and a
	// shirt. The shirt is priced $20 and has a cost of goods sold value of $5. The
	// cross-sell gross profit of this order is $15 = $20 - $5. This metric is only
	// available if you report conversions with cart data. This metric is a
	// monetary value and returned in the customer's currency by default. See the
	// metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	CrossSellGrossProfitMicros int64 `json:"crossSellGrossProfitMicros,omitempty,string"`
	// CrossSellRevenueMicros: Cross-sell revenue is the total amount you made from
	// products sold as a result of advertising a different product. How it works:
	// You report conversions with cart data for completed purchases on your
	// website. If the ad that was interacted with before the purchase has an
	// associated product (see Shopping Ads) then this product is considered the
	// advertised product. Any product included in the order the customer places is
	// a sold product. If these products don't match then this is considered
	// cross-sell. Cross-sell revenue is the total value you made from cross-sell
	// attributed to your ads. Example: Someone clicked on a Shopping ad for a hat
	// then bought the same hat and a shirt. The hat is priced $10 and the shirt is
	// priced $20. The cross-sell revenue of this order is $20. This metric is only
	// available if you report conversions with cart data. This metric is a
	// monetary value and returned in the customer's currency by default. See the
	// metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	CrossSellRevenueMicros int64 `json:"crossSellRevenueMicros,omitempty,string"`
	// CrossSellUnitsSold: Cross-sell units sold is the total number of products
	// sold as a result of advertising a different product. How it works: You
	// report conversions with cart data for completed purchases on your website.
	// If the ad that was interacted with before the purchase has an associated
	// product (see Shopping Ads) then this product is considered the advertised
	// product. Any product included in the order the customer places is a sold
	// product. If these products don't match then this is considered cross-sell.
	// Cross-sell units sold is the total number of cross-sold products from all
	// orders attributed to your ads. Example: Someone clicked on a Shopping ad for
	// a hat then bought the same hat, a shirt and a jacket. The cross-sell units
	// sold in this order is 2. This metric is only available if you report
	// conversions with cart data.
	CrossSellUnitsSold float64 `json:"crossSellUnitsSold,omitempty"`
	// Ctr: The number of clicks your ad receives (Clicks) divided by the number of
	// times your ad is shown (Impressions).
	Ctr float64 `json:"ctr,omitempty"`
	// HistoricalCreativeQualityScore: The creative historical quality score.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "BELOW_AVERAGE" - Quality of the creative is below average.
	//   "AVERAGE" - Quality of the creative is average.
	//   "ABOVE_AVERAGE" - Quality of the creative is above average.
	HistoricalCreativeQualityScore string `json:"historicalCreativeQualityScore,omitempty"`
	// HistoricalLandingPageQualityScore: The quality of historical landing page
	// experience.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "BELOW_AVERAGE" - Quality of the creative is below average.
	//   "AVERAGE" - Quality of the creative is average.
	//   "ABOVE_AVERAGE" - Quality of the creative is above average.
	HistoricalLandingPageQualityScore string `json:"historicalLandingPageQualityScore,omitempty"`
	// HistoricalQualityScore: The historical quality score.
	HistoricalQualityScore int64 `json:"historicalQualityScore,omitempty,string"`
	// HistoricalSearchPredictedCtr: The historical search predicted click through
	// rate (CTR).
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "BELOW_AVERAGE" - Quality of the creative is below average.
	//   "AVERAGE" - Quality of the creative is average.
	//   "ABOVE_AVERAGE" - Quality of the creative is above average.
	HistoricalSearchPredictedCtr string `json:"historicalSearchPredictedCtr,omitempty"`
	// Impressions: Count of how often your ad has appeared on a search results
	// page or website on the Google Network.
	Impressions int64 `json:"impressions,omitempty,string"`
	// InteractionEventTypes: The types of payable and free interactions.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "CLICK" - 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.
	//   "ENGAGEMENT" - The user's expressed intent to engage with the ad in-place.
	//   "VIDEO_VIEW" - User viewed a video ad.
	//   "NONE" - The default InteractionEventType for ad conversion events. This
	// is used when an ad conversion row does NOT indicate that the free
	// interactions (for example, the ad conversions) should be 'promoted' and
	// reported as part of the core metrics. These are simply other (ad)
	// conversions.
	InteractionEventTypes []string `json:"interactionEventTypes,omitempty"`
	// InteractionRate: 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 float64 `json:"interactionRate,omitempty"`
	// Interactions: 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 int64 `json:"interactions,omitempty,string"`
	// InvalidClickRate: The percentage of clicks filtered out of your total number
	// of clicks (filtered + non-filtered clicks) during the reporting period.
	InvalidClickRate float64 `json:"invalidClickRate,omitempty"`
	// InvalidClicks: Number of clicks Google considers illegitimate and doesn't
	// charge you for.
	InvalidClicks int64 `json:"invalidClicks,omitempty,string"`
	// LeadCostOfGoodsSoldMicros: Lead cost of goods sold (COGS) is the total cost
	// of products sold as a result of advertising the same product. How it works:
	// You report conversions with cart data for completed purchases on your
	// website. If the ad that was interacted with has an associated product (see
	// Shopping Ads) then this product is considered the advertised product. Any
	// product included in the order the customer places is a sold product. If the
	// advertised and sold products match, then the cost of these goods is counted
	// under lead cost of goods sold. Example: Someone clicked on a Shopping ad for
	// a hat then bought the same hat and a shirt. The hat has a cost of goods sold
	// value of $3, the shirt has a cost of goods sold value of $5. The lead cost
	// of goods sold for this order is $3. This metric is only available if you
	// report conversions with cart data. This metric is a monetary value and
	// returned in the customer's currency by default. See the metrics_currency
	// parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	LeadCostOfGoodsSoldMicros int64 `json:"leadCostOfGoodsSoldMicros,omitempty,string"`
	// LeadGrossProfitMicros: Lead gross profit is the profit you made from
	// products sold as a result of advertising the same product, minus cost of
	// goods sold (COGS). How it works: You report conversions with cart data for
	// completed purchases on your website. If the ad that was interacted with
	// before the purchase has an associated product (see Shopping Ads) then this
	// product is considered the advertised product. Any product included in the
	// order the customer places is a sold product. If the advertised and sold
	// products match, then the revenue you made from these sales minus the cost of
	// goods sold is your lead gross profit. Example: Someone clicked on a Shopping
	// ad for a hat then bought the same hat and a shirt. The hat is priced $10 and
	// has a cost of goods sold value of $3. The lead gross profit of this order is
	// $7 = $10 - $3. This metric is only available if you report conversions with
	// cart data. This metric is a monetary value and returned in the customer's
	// currency by default. See the metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	LeadGrossProfitMicros int64 `json:"leadGrossProfitMicros,omitempty,string"`
	// LeadRevenueMicros: Lead revenue is the total amount you made from products
	// sold as a result of advertising the same product. How it works: You report
	// conversions with cart data for completed purchases on your website. If the
	// ad that was interacted with before the purchase has an associated product
	// (see Shopping Ads) then this product is considered the advertised product.
	// Any product included in the order the customer places is a sold product. If
	// the advertised and sold products match, then the total value you made from
	// the sales of these products is shown under lead revenue. Example: Someone
	// clicked on a Shopping ad for a hat then bought the same hat and a shirt. The
	// hat is priced $10 and the shirt is priced $20. The lead revenue of this
	// order is $10. This metric is only available if you report conversions with
	// cart data. This metric is a monetary value and returned in the customer's
	// currency by default. See the metrics_currency parameter at
	// https://developers.google.com/search-ads/reporting/query/query-structure#parameters_clause
	LeadRevenueMicros int64 `json:"leadRevenueMicros,omitempty,string"`
	// LeadUnitsSold: Lead units sold is the total number of products sold as a
	// result of advertising the same product. How it works: You report conversions
	// with cart data for completed purchases on your website. If the ad that was
	// interacted with before the purchase has an associated product (see Shopping
	// Ads) then this product is considered the advertised product. Any product
	// included in the order the customer places is a sold product. If the
	// advertised and sold products match, then the total number of these products
	// sold is shown under lead units sold. Example: Someone clicked on a Shopping
	// ad for a hat then bought the same hat, a shirt and a jacket. The lead units
	// sold in this order is 1. This metric is only available if you report
	// conversions with cart data.
	LeadUnitsSold float64 `json:"leadUnitsSold,omitempty"`
	// MobileFriendlyClicksPercentage: The percentage of mobile clicks that go to a
	// mobile-friendly page.
	MobileFriendlyClicksPercentage float64 `json:"mobileFriendlyClicksPercentage,omitempty"`
	// RawEventConversionMetrics: The raw event conversion metrics.
	RawEventConversionMetrics []*GoogleAdsSearchads360V0Common__Value `json:"rawEventConversionMetrics,omitempty"`
	// SearchAbsoluteTopImpressionShare: 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/sa360/answer/9566729 for details.
	// Any value below 0.1 is reported as 0.0999.
	SearchAbsoluteTopImpressionShare float64 `json:"searchAbsoluteTopImpressionShare,omitempty"`
	// SearchBudgetLostAbsoluteTopImpressionShare: The number estimating how often
	// your ad wasn't the very first ad among the top ads in the 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 float64 `json:"searchBudgetLostAbsoluteTopImpressionShare,omitempty"`
	// SearchBudgetLostImpressionShare: 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 float64 `json:"searchBudgetLostImpressionShare,omitempty"`
	// SearchBudgetLostTopImpressionShare: The number estimating how often your ad
	// didn't show adjacent to the top 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 float64 `json:"searchBudgetLostTopImpressionShare,omitempty"`
	// SearchClickShare: 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 float64 `json:"searchClickShare,omitempty"`
	// SearchExactMatchImpressionShare: 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 float64 `json:"searchExactMatchImpressionShare,omitempty"`
	// SearchImpressionShare: 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 float64 `json:"searchImpressionShare,omitempty"`
	// SearchRankLostAbsoluteTopImpressionShare: The number estimating how often
	// your ad wasn't the very first ad among the top ads in the 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 float64 `json:"searchRankLostAbsoluteTopImpressionShare,omitempty"`
	// SearchRankLostImpressionShare: 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 float64 `json:"searchRankLostImpressionShare,omitempty"`
	// SearchRankLostTopImpressionShare: The number estimating how often your ad
	// didn't show adjacent to the top 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 float64 `json:"searchRankLostTopImpressionShare,omitempty"`
	// SearchTopImpressionShare: The impressions you've received among the top ads
	// compared to the estimated number of impressions you were eligible to receive
	// among the top ads. 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. Top ads are
	// generally above the top organic results, although they may show below the
	// top organic results on certain queries.
	SearchTopImpressionShare float64 `json:"searchTopImpressionShare,omitempty"`
	// TopImpressionPercentage: The percent of your ad impressions that are shown
	// adjacent to the top organic search results.
	TopImpressionPercentage float64 `json:"topImpressionPercentage,omitempty"`
	// ValuePerAllConversions: The value of all conversions divided by the number
	// of all conversions.
	ValuePerAllConversions float64 `json:"valuePerAllConversions,omitempty"`
	// ValuePerAllConversionsByConversionDate: The value of all conversions divided
	// by the number of all conversions. When this column is selected with date,
	// the values in date column means the conversion date. Details for the
	// by_conversion_date columns are available at
	// https://support.google.com/sa360/answer/9250611.
	ValuePerAllConversionsByConversionDate float64 `json:"valuePerAllConversionsByConversionDate,omitempty"`
	// ValuePerConversion: The value of biddable conversion divided by the number
	// of biddable conversions. Shows how much, on average, each of the biddable
	// conversions is worth.
	ValuePerConversion float64 `json:"valuePerConversion,omitempty"`
	// ValuePerConversionsByConversionDate: Biddable conversions value by
	// conversion date divided by biddable conversions by conversion date. Shows
	// how much, on average, each of the biddable conversions is worth (by
	// conversion date). When this column is selected with date, the values in date
	// column means the conversion date.
	ValuePerConversionsByConversionDate float64 `json:"valuePerConversionsByConversionDate,omitempty"`
	// Visits: Clicks that Search Ads 360 has successfully recorded and forwarded
	// to an advertiser's landing page.
	Visits float64 `json:"visits,omitempty"`
	// ForceSendFields is a list of field names (e.g.
	// "AbsoluteTopImpressionPercentage") to unconditionally include in API
	// requests. By default, fields with empty or default values are omitted from
	// API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AbsoluteTopImpressionPercentage")
	// to include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__Metrics) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__Metrics
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

func (s *GoogleAdsSearchads360V0Common__Metrics) UnmarshalJSON(data []byte) error {
	type NoMethod GoogleAdsSearchads360V0Common__Metrics
	var s1 struct {
		AbsoluteTopImpressionPercentage                   gensupport.JSONFloat64 `json:"absoluteTopImpressionPercentage"`
		AllConversions                                    gensupport.JSONFloat64 `json:"allConversions"`
		AllConversionsByConversionDate                    gensupport.JSONFloat64 `json:"allConversionsByConversionDate"`
		AllConversionsFromClickToCall                     gensupport.JSONFloat64 `json:"allConversionsFromClickToCall"`
		AllConversionsFromDirections                      gensupport.JSONFloat64 `json:"allConversionsFromDirections"`
		AllConversionsFromInteractionsRate                gensupport.JSONFloat64 `json:"allConversionsFromInteractionsRate"`
		AllConversionsFromInteractionsValuePerInteraction gensupport.JSONFloat64 `json:"allConversionsFromInteractionsValuePerInteraction"`
		AllConversionsFromMenu                            gensupport.JSONFloat64 `json:"allConversionsFromMenu"`
		AllConversionsFromOrder                           gensupport.JSONFloat64 `json:"allConversionsFromOrder"`
		AllConversionsFromOtherEngagement                 gensupport.JSONFloat64 `json:"allConversionsFromOtherEngagement"`
		AllConversionsFromStoreVisit                      gensupport.JSONFloat64 `json:"allConversionsFromStoreVisit"`
		AllConversionsFromStoreWebsite                    gensupport.JSONFloat64 `json:"allConversionsFromStoreWebsite"`
		AllConversionsValue                               gensupport.JSONFloat64 `json:"allConversionsValue"`
		AllConversionsValueByConversionDate               gensupport.JSONFloat64 `json:"allConversionsValueByConversionDate"`
		AllConversionsValuePerCost                        gensupport.JSONFloat64 `json:"allConversionsValuePerCost"`
		AverageCost                                       gensupport.JSONFloat64 `json:"averageCost"`
		AverageCpc                                        gensupport.JSONFloat64 `json:"averageCpc"`
		AverageCpm                                        gensupport.JSONFloat64 `json:"averageCpm"`
		ClientAccountConversions                          gensupport.JSONFloat64 `json:"clientAccountConversions"`
		ClientAccountConversionsValue                     gensupport.JSONFloat64 `json:"clientAccountConversionsValue"`
		ClientAccountCrossSellUnitsSold                   gensupport.JSONFloat64 `json:"clientAccountCrossSellUnitsSold"`
		ClientAccountLeadUnitsSold                        gensupport.JSONFloat64 `json:"clientAccountLeadUnitsSold"`
		ContentBudgetLostImpressionShare                  gensupport.JSONFloat64 `json:"contentBudgetLostImpressionShare"`
		ContentImpressionShare                            gensupport.JSONFloat64 `json:"contentImpressionShare"`
		ContentRankLostImpressionShare                    gensupport.JSONFloat64 `json:"contentRankLostImpressionShare"`
		Conversions                                       gensupport.JSONFloat64 `json:"conversions"`
		ConversionsByConversionDate                       gensupport.JSONFloat64 `json:"conversionsByConversionDate"`
		ConversionsFromInteractionsRate                   gensupport.JSONFloat64 `json:"conversionsFromInteractionsRate"`
		ConversionsFromInteractionsValuePerInteraction    gensupport.JSONFloat64 `json:"conversionsFromInteractionsValuePerInteraction"`
		ConversionsValue                                  gensupport.JSONFloat64 `json:"conversionsValue"`
		ConversionsValueByConversionDate                  gensupport.JSONFloat64 `json:"conversionsValueByConversionDate"`
		ConversionsValuePerCost                           gensupport.JSONFloat64 `json:"conversionsValuePerCost"`
		CostPerAllConversions                             gensupport.JSONFloat64 `json:"costPerAllConversions"`
		CostPerConversion                                 gensupport.JSONFloat64 `json:"costPerConversion"`
		CostPerCurrentModelAttributedConversion           gensupport.JSONFloat64 `json:"costPerCurrentModelAttributedConversion"`
		CrossDeviceConversions                            gensupport.JSONFloat64 `json:"crossDeviceConversions"`
		CrossDeviceConversionsValue                       gensupport.JSONFloat64 `json:"crossDeviceConversionsValue"`
		CrossSellUnitsSold                                gensupport.JSONFloat64 `json:"crossSellUnitsSold"`
		Ctr                                               gensupport.JSONFloat64 `json:"ctr"`
		InteractionRate                                   gensupport.JSONFloat64 `json:"interactionRate"`
		InvalidClickRate                                  gensupport.JSONFloat64 `json:"invalidClickRate"`
		LeadUnitsSold                                     gensupport.JSONFloat64 `json:"leadUnitsSold"`
		MobileFriendlyClicksPercentage                    gensupport.JSONFloat64 `json:"mobileFriendlyClicksPercentage"`
		SearchAbsoluteTopImpressionShare                  gensupport.JSONFloat64 `json:"searchAbsoluteTopImpressionShare"`
		SearchBudgetLostAbsoluteTopImpressionShare        gensupport.JSONFloat64 `json:"searchBudgetLostAbsoluteTopImpressionShare"`
		SearchBudgetLostImpressionShare                   gensupport.JSONFloat64 `json:"searchBudgetLostImpressionShare"`
		SearchBudgetLostTopImpressionShare                gensupport.JSONFloat64 `json:"searchBudgetLostTopImpressionShare"`
		SearchClickShare                                  gensupport.JSONFloat64 `json:"searchClickShare"`
		SearchExactMatchImpressionShare                   gensupport.JSONFloat64 `json:"searchExactMatchImpressionShare"`
		SearchImpressionShare                             gensupport.JSONFloat64 `json:"searchImpressionShare"`
		SearchRankLostAbsoluteTopImpressionShare          gensupport.JSONFloat64 `json:"searchRankLostAbsoluteTopImpressionShare"`
		SearchRankLostImpressionShare                     gensupport.JSONFloat64 `json:"searchRankLostImpressionShare"`
		SearchRankLostTopImpressionShare                  gensupport.JSONFloat64 `json:"searchRankLostTopImpressionShare"`
		SearchTopImpressionShare                          gensupport.JSONFloat64 `json:"searchTopImpressionShare"`
		TopImpressionPercentage                           gensupport.JSONFloat64 `json:"topImpressionPercentage"`
		ValuePerAllConversions                            gensupport.JSONFloat64 `json:"valuePerAllConversions"`
		ValuePerAllConversionsByConversionDate            gensupport.JSONFloat64 `json:"valuePerAllConversionsByConversionDate"`
		ValuePerConversion                                gensupport.JSONFloat64 `json:"valuePerConversion"`
		ValuePerConversionsByConversionDate               gensupport.JSONFloat64 `json:"valuePerConversionsByConversionDate"`
		Visits                                            gensupport.JSONFloat64 `json:"visits"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.AbsoluteTopImpressionPercentage = float64(s1.AbsoluteTopImpressionPercentage)
	s.AllConversions = float64(s1.AllConversions)
	s.AllConversionsByConversionDate = float64(s1.AllConversionsByConversionDate)
	s.AllConversionsFromClickToCall = float64(s1.AllConversionsFromClickToCall)
	s.AllConversionsFromDirections = float64(s1.AllConversionsFromDirections)
	s.AllConversionsFromInteractionsRate = float64(s1.AllConversionsFromInteractionsRate)
	s.AllConversionsFromInteractionsValuePerInteraction = float64(s1.AllConversionsFromInteractionsValuePerInteraction)
	s.AllConversionsFromMenu = float64(s1.AllConversionsFromMenu)
	s.AllConversionsFromOrder = float64(s1.AllConversionsFromOrder)
	s.AllConversionsFromOtherEngagement = float64(s1.AllConversionsFromOtherEngagement)
	s.AllConversionsFromStoreVisit = float64(s1.AllConversionsFromStoreVisit)
	s.AllConversionsFromStoreWebsite = float64(s1.AllConversionsFromStoreWebsite)
	s.AllConversionsValue = float64(s1.AllConversionsValue)
	s.AllConversionsValueByConversionDate = float64(s1.AllConversionsValueByConversionDate)
	s.AllConversionsValuePerCost = float64(s1.AllConversionsValuePerCost)
	s.AverageCost = float64(s1.AverageCost)
	s.AverageCpc = float64(s1.AverageCpc)
	s.AverageCpm = float64(s1.AverageCpm)
	s.ClientAccountConversions = float64(s1.ClientAccountConversions)
	s.ClientAccountConversionsValue = float64(s1.ClientAccountConversionsValue)
	s.ClientAccountCrossSellUnitsSold = float64(s1.ClientAccountCrossSellUnitsSold)
	s.ClientAccountLeadUnitsSold = float64(s1.ClientAccountLeadUnitsSold)
	s.ContentBudgetLostImpressionShare = float64(s1.ContentBudgetLostImpressionShare)
	s.ContentImpressionShare = float64(s1.ContentImpressionShare)
	s.ContentRankLostImpressionShare = float64(s1.ContentRankLostImpressionShare)
	s.Conversions = float64(s1.Conversions)
	s.ConversionsByConversionDate = float64(s1.ConversionsByConversionDate)
	s.ConversionsFromInteractionsRate = float64(s1.ConversionsFromInteractionsRate)
	s.ConversionsFromInteractionsValuePerInteraction = float64(s1.ConversionsFromInteractionsValuePerInteraction)
	s.ConversionsValue = float64(s1.ConversionsValue)
	s.ConversionsValueByConversionDate = float64(s1.ConversionsValueByConversionDate)
	s.ConversionsValuePerCost = float64(s1.ConversionsValuePerCost)
	s.CostPerAllConversions = float64(s1.CostPerAllConversions)
	s.CostPerConversion = float64(s1.CostPerConversion)
	s.CostPerCurrentModelAttributedConversion = float64(s1.CostPerCurrentModelAttributedConversion)
	s.CrossDeviceConversions = float64(s1.CrossDeviceConversions)
	s.CrossDeviceConversionsValue = float64(s1.CrossDeviceConversionsValue)
	s.CrossSellUnitsSold = float64(s1.CrossSellUnitsSold)
	s.Ctr = float64(s1.Ctr)
	s.InteractionRate = float64(s1.InteractionRate)
	s.InvalidClickRate = float64(s1.InvalidClickRate)
	s.LeadUnitsSold = float64(s1.LeadUnitsSold)
	s.MobileFriendlyClicksPercentage = float64(s1.MobileFriendlyClicksPercentage)
	s.SearchAbsoluteTopImpressionShare = float64(s1.SearchAbsoluteTopImpressionShare)
	s.SearchBudgetLostAbsoluteTopImpressionShare = float64(s1.SearchBudgetLostAbsoluteTopImpressionShare)
	s.SearchBudgetLostImpressionShare = float64(s1.SearchBudgetLostImpressionShare)
	s.SearchBudgetLostTopImpressionShare = float64(s1.SearchBudgetLostTopImpressionShare)
	s.SearchClickShare = float64(s1.SearchClickShare)
	s.SearchExactMatchImpressionShare = float64(s1.SearchExactMatchImpressionShare)
	s.SearchImpressionShare = float64(s1.SearchImpressionShare)
	s.SearchRankLostAbsoluteTopImpressionShare = float64(s1.SearchRankLostAbsoluteTopImpressionShare)
	s.SearchRankLostImpressionShare = float64(s1.SearchRankLostImpressionShare)
	s.SearchRankLostTopImpressionShare = float64(s1.SearchRankLostTopImpressionShare)
	s.SearchTopImpressionShare = float64(s1.SearchTopImpressionShare)
	s.TopImpressionPercentage = float64(s1.TopImpressionPercentage)
	s.ValuePerAllConversions = float64(s1.ValuePerAllConversions)
	s.ValuePerAllConversionsByConversionDate = float64(s1.ValuePerAllConversionsByConversionDate)
	s.ValuePerConversion = float64(s1.ValuePerConversion)
	s.ValuePerConversionsByConversionDate = float64(s1.ValuePerConversionsByConversionDate)
	s.Visits = float64(s1.Visits)
	return nil
}

// GoogleAdsSearchads360V0Common__MobileAppAsset: An asset representing a
// mobile app.
type GoogleAdsSearchads360V0Common__MobileAppAsset struct {
	// AppId: Required. A string that uniquely identifies a mobile application. It
	// should just contain the platform native id, like "com.android.ebay" for
	// Android or "12345689" for iOS.
	AppId string `json:"appId,omitempty"`
	// AppStore: Required. The application store that distributes this specific
	// app.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "APPLE_APP_STORE" - Mobile app vendor for Apple app store.
	//   "GOOGLE_APP_STORE" - Mobile app vendor for Google app store.
	AppStore string `json:"appStore,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AppId") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AppId") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__MobileAppAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__MobileAppAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__PercentCpc: A bidding strategy where bids are
// a fraction of the advertised price for some good or service.
type GoogleAdsSearchads360V0Common__PercentCpc struct {
	// CpcBidCeilingMicros: 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 int64 `json:"cpcBidCeilingMicros,omitempty,string"`
	// EnhancedCpcEnabled: 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 bool `json:"enhancedCpcEnabled,omitempty"`
	// ForceSendFields is a list of field names (e.g. "CpcBidCeilingMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CpcBidCeilingMicros") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__PercentCpc) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__PercentCpc
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__RealTimeBiddingSetting: Settings for
// Real-Time Bidding, a feature only available for campaigns targeting the Ad
// Exchange network.
type GoogleAdsSearchads360V0Common__RealTimeBiddingSetting struct {
	// OptIn: Whether the campaign is opted in to real-time bidding.
	OptIn bool `json:"optIn,omitempty"`
	// ForceSendFields is a list of field names (e.g. "OptIn") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "OptIn") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__RealTimeBiddingSetting) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__RealTimeBiddingSetting
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__SearchAds360ExpandedDynamicSearchAdInfo: An
// expanded dynamic search ad.
type GoogleAdsSearchads360V0Common__SearchAds360ExpandedDynamicSearchAdInfo struct {
	// AdTrackingId: The tracking id of the ad.
	AdTrackingId int64 `json:"adTrackingId,omitempty,string"`
	// Description1: The first line of the ad's description.
	Description1 string `json:"description1,omitempty"`
	// Description2: The second line of the ad's description.
	Description2 string `json:"description2,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdTrackingId") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdTrackingId") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__SearchAds360ExpandedDynamicSearchAdInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__SearchAds360ExpandedDynamicSearchAdInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__SearchAds360ExpandedTextAdInfo: A Search Ads
// 360 expanded text ad.
type GoogleAdsSearchads360V0Common__SearchAds360ExpandedTextAdInfo struct {
	// AdTrackingId: The tracking id of the ad.
	AdTrackingId int64 `json:"adTrackingId,omitempty,string"`
	// Description1: The first line of the ad's description.
	Description1 string `json:"description1,omitempty"`
	// Description2: The second line of the ad's description.
	Description2 string `json:"description2,omitempty"`
	// Headline: The headline of the ad.
	Headline string `json:"headline,omitempty"`
	// Headline2: The second headline of the ad.
	Headline2 string `json:"headline2,omitempty"`
	// Headline3: The third headline of the ad.
	Headline3 string `json:"headline3,omitempty"`
	// Path1: Text appended to the auto-generated visible URL with a delimiter.
	Path1 string `json:"path1,omitempty"`
	// Path2: Text appended to path1 with a delimiter.
	Path2 string `json:"path2,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdTrackingId") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdTrackingId") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__SearchAds360ExpandedTextAdInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__SearchAds360ExpandedTextAdInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__SearchAds360ProductAdInfo: A Search Ads 360
// product ad.
type GoogleAdsSearchads360V0Common__SearchAds360ProductAdInfo struct {
}

// GoogleAdsSearchads360V0Common__SearchAds360ResponsiveSearchAdInfo: A Search
// Ads 360 responsive search ad.
type GoogleAdsSearchads360V0Common__SearchAds360ResponsiveSearchAdInfo struct {
	// AdTrackingId: The tracking id of the ad.
	AdTrackingId int64 `json:"adTrackingId,omitempty,string"`
	// Path1: Text appended to the auto-generated visible URL with a delimiter.
	Path1 string `json:"path1,omitempty"`
	// Path2: Text appended to path1 with a delimiter.
	Path2 string `json:"path2,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdTrackingId") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdTrackingId") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__SearchAds360ResponsiveSearchAdInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__SearchAds360ResponsiveSearchAdInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__SearchAds360TextAdInfo: A Search Ads 360 text
// ad.
type GoogleAdsSearchads360V0Common__SearchAds360TextAdInfo struct {
	// AdTrackingId: The tracking id of the ad.
	AdTrackingId int64 `json:"adTrackingId,omitempty,string"`
	// Description1: The first line of the ad's description.
	Description1 string `json:"description1,omitempty"`
	// Description2: The second line of the ad's description.
	Description2 string `json:"description2,omitempty"`
	// DisplayMobileUrl: The displayed mobile URL of the ad.
	DisplayMobileUrl string `json:"displayMobileUrl,omitempty"`
	// DisplayUrl: The displayed URL of the ad.
	DisplayUrl string `json:"displayUrl,omitempty"`
	// Headline: The headline of the ad.
	Headline string `json:"headline,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdTrackingId") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdTrackingId") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__SearchAds360TextAdInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__SearchAds360TextAdInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__Segments: Segment only fields.
type GoogleAdsSearchads360V0Common__Segments struct {
	// AdNetworkType: Ad network type.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - The value is unknown in this version.
	//   "SEARCH" - Google search.
	//   "SEARCH_PARTNERS" - Search partners.
	//   "CONTENT" - Display Network.
	//   "YOUTUBE_SEARCH" - YouTube Search.
	//   "YOUTUBE_WATCH" - YouTube Videos
	//   "MIXED" - Cross-network.
	AdNetworkType string `json:"adNetworkType,omitempty"`
	// AssetInteractionTarget: Only used with CustomerAsset, CampaignAsset and
	// AdGroupAsset metrics. Indicates whether the interaction metrics occurred on
	// the asset itself or a different asset or ad unit. Interactions (for example,
	// clicks) are counted across all the parts of the served ad (for example, Ad
	// itself and other components like Sitelinks) when they are served together.
	// When interaction_on_this_asset is true, it means the interactions are on
	// this specific asset and when interaction_on_this_asset is false, it means
	// the interactions is not on this specific asset but on other parts of the
	// served ad this asset is served with.
	AssetInteractionTarget *GoogleAdsSearchads360V0Common__AssetInteractionTarget `json:"assetInteractionTarget,omitempty"`
	// ConversionAction: Resource name of the conversion action.
	ConversionAction string `json:"conversionAction,omitempty"`
	// ConversionActionCategory: Conversion action category.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "DEFAULT" - Default category.
	//   "PAGE_VIEW" - User visiting a page.
	//   "PURCHASE" - Purchase, sales, or "order placed" event.
	//   "SIGNUP" - Signup user action.
	//   "LEAD" - Lead-generating action.
	//   "DOWNLOAD" - Software download action (as for an app).
	//   "ADD_TO_CART" - The addition of items to a shopping cart or bag on an
	// advertiser site.
	//   "BEGIN_CHECKOUT" - When someone enters the checkout flow on an advertiser
	// site.
	//   "SUBSCRIBE_PAID" - The start of a paid subscription for a product or
	// service.
	//   "PHONE_CALL_LEAD" - A call to indicate interest in an advertiser's
	// offering.
	//   "IMPORTED_LEAD" - A lead conversion imported from an external source into
	// Google Ads.
	//   "SUBMIT_LEAD_FORM" - A submission of a form on an advertiser site
	// indicating business interest.
	//   "BOOK_APPOINTMENT" - A booking of an appointment with an advertiser's
	// business.
	//   "REQUEST_QUOTE" - A quote or price estimate request.
	//   "GET_DIRECTIONS" - A search for an advertiser's business location with
	// intention to visit.
	//   "OUTBOUND_CLICK" - A click to an advertiser's partner's site.
	//   "CONTACT" - A call, SMS, email, chat or other type of contact to an
	// advertiser.
	//   "ENGAGEMENT" - A website engagement event such as long site time or a
	// Google Analytics (GA) Smart Goal. Intended to be used for GA, Firebase, GA
	// Gold goal imports.
	//   "STORE_VISIT" - A visit to a physical store location.
	//   "STORE_SALE" - A sale occurring in a physical store.
	//   "QUALIFIED_LEAD" - A lead conversion imported from an external source into
	// Google Ads, that has been further qualified by the advertiser
	// (marketing/sales team). In the lead-to-sale journey, advertisers get leads,
	// then act on them by reaching out to the consumer. If the consumer is
	// interested and may end up buying their product, the advertiser marks such
	// leads as "qualified leads".
	//   "CONVERTED_LEAD" - A lead conversion imported from an external source into
	// Google Ads, that has further completed a chosen stage as defined by the lead
	// gen advertiser.
	ConversionActionCategory string `json:"conversionActionCategory,omitempty"`
	// ConversionActionName: Conversion action name.
	ConversionActionName string `json:"conversionActionName,omitempty"`
	// ConversionCustomDimensions: The conversion custom dimensions.
	ConversionCustomDimensions []*GoogleAdsSearchads360V0Common__Value `json:"conversionCustomDimensions,omitempty"`
	// Date: Date to which metrics apply. yyyy-MM-dd format, for example,
	// 2018-04-17.
	Date string `json:"date,omitempty"`
	// DayOfWeek: Day of the week, for example, MONDAY.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - The value is unknown in this version.
	//   "MONDAY" - Monday.
	//   "TUESDAY" - Tuesday.
	//   "WEDNESDAY" - Wednesday.
	//   "THURSDAY" - Thursday.
	//   "FRIDAY" - Friday.
	//   "SATURDAY" - Saturday.
	//   "SUNDAY" - Sunday.
	DayOfWeek string `json:"dayOfWeek,omitempty"`
	// Device: Device to which metrics apply.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - The value is unknown in this version.
	//   "MOBILE" - Mobile devices with full browsers.
	//   "TABLET" - Tablets with full browsers.
	//   "DESKTOP" - Computers.
	//   "CONNECTED_TV" - Smart TVs and game consoles.
	//   "OTHER" - Other device types.
	Device string `json:"device,omitempty"`
	// Keyword: Keyword criterion.
	Keyword *GoogleAdsSearchads360V0Common__Keyword `json:"keyword,omitempty"`
	// Month: Month as represented by the date of the first day of a month.
	// Formatted as yyyy-MM-dd.
	Month string `json:"month,omitempty"`
	// ProductBiddingCategoryLevel1: Bidding category (level 1) of the product.
	ProductBiddingCategoryLevel1 string `json:"productBiddingCategoryLevel1,omitempty"`
	// ProductBiddingCategoryLevel2: Bidding category (level 2) of the product.
	ProductBiddingCategoryLevel2 string `json:"productBiddingCategoryLevel2,omitempty"`
	// ProductBiddingCategoryLevel3: Bidding category (level 3) of the product.
	ProductBiddingCategoryLevel3 string `json:"productBiddingCategoryLevel3,omitempty"`
	// ProductBiddingCategoryLevel4: Bidding category (level 4) of the product.
	ProductBiddingCategoryLevel4 string `json:"productBiddingCategoryLevel4,omitempty"`
	// ProductBiddingCategoryLevel5: Bidding category (level 5) of the product.
	ProductBiddingCategoryLevel5 string `json:"productBiddingCategoryLevel5,omitempty"`
	// ProductBrand: Brand of the product.
	ProductBrand string `json:"productBrand,omitempty"`
	// ProductChannel: Channel of the product.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ONLINE" - The item is sold online.
	//   "LOCAL" - The item is sold in local stores.
	ProductChannel string `json:"productChannel,omitempty"`
	// ProductChannelExclusivity: Channel exclusivity of the product.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "SINGLE_CHANNEL" - The item is sold through one channel only, either local
	// stores or online as indicated by its ProductChannel.
	//   "MULTI_CHANNEL" - The item is matched to its online or local stores
	// counterpart, indicating it is available for purchase in both
	// ShoppingProductChannels.
	ProductChannelExclusivity string `json:"productChannelExclusivity,omitempty"`
	// ProductCondition: Condition of the product.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "OLD" - The product condition is old.
	//   "NEW" - The product condition is new.
	//   "REFURBISHED" - The product condition is refurbished.
	//   "USED" - The product condition is used.
	ProductCondition string `json:"productCondition,omitempty"`
	// ProductCountry: Resource name of the geo target constant for the country of
	// sale of the product.
	ProductCountry string `json:"productCountry,omitempty"`
	// ProductCustomAttribute0: Custom attribute 0 of the product.
	ProductCustomAttribute0 string `json:"productCustomAttribute0,omitempty"`
	// ProductCustomAttribute1: Custom attribute 1 of the product.
	ProductCustomAttribute1 string `json:"productCustomAttribute1,omitempty"`
	// ProductCustomAttribute2: Custom attribute 2 of the product.
	ProductCustomAttribute2 string `json:"productCustomAttribute2,omitempty"`
	// ProductCustomAttribute3: Custom attribute 3 of the product.
	ProductCustomAttribute3 string `json:"productCustomAttribute3,omitempty"`
	// ProductCustomAttribute4: Custom attribute 4 of the product.
	ProductCustomAttribute4 string `json:"productCustomAttribute4,omitempty"`
	// ProductItemId: Item ID of the product.
	ProductItemId string `json:"productItemId,omitempty"`
	// ProductLanguage: Resource name of the language constant for the language of
	// the product.
	ProductLanguage string `json:"productLanguage,omitempty"`
	// ProductSoldBiddingCategoryLevel1: Bidding category (level 1) of the product
	// sold.
	ProductSoldBiddingCategoryLevel1 string `json:"productSoldBiddingCategoryLevel1,omitempty"`
	// ProductSoldBiddingCategoryLevel2: Bidding category (level 2) of the product
	// sold.
	ProductSoldBiddingCategoryLevel2 string `json:"productSoldBiddingCategoryLevel2,omitempty"`
	// ProductSoldBiddingCategoryLevel3: Bidding category (level 3) of the product
	// sold.
	ProductSoldBiddingCategoryLevel3 string `json:"productSoldBiddingCategoryLevel3,omitempty"`
	// ProductSoldBiddingCategoryLevel4: Bidding category (level 4) of the product
	// sold.
	ProductSoldBiddingCategoryLevel4 string `json:"productSoldBiddingCategoryLevel4,omitempty"`
	// ProductSoldBiddingCategoryLevel5: Bidding category (level 5) of the product
	// sold.
	ProductSoldBiddingCategoryLevel5 string `json:"productSoldBiddingCategoryLevel5,omitempty"`
	// ProductSoldBrand: Brand of the product sold.
	ProductSoldBrand string `json:"productSoldBrand,omitempty"`
	// ProductSoldCondition: Condition of the product sold.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "OLD" - The product condition is old.
	//   "NEW" - The product condition is new.
	//   "REFURBISHED" - The product condition is refurbished.
	//   "USED" - The product condition is used.
	ProductSoldCondition string `json:"productSoldCondition,omitempty"`
	// ProductSoldCustomAttribute0: Custom attribute 0 of the product sold.
	ProductSoldCustomAttribute0 string `json:"productSoldCustomAttribute0,omitempty"`
	// ProductSoldCustomAttribute1: Custom attribute 1 of the product sold.
	ProductSoldCustomAttribute1 string `json:"productSoldCustomAttribute1,omitempty"`
	// ProductSoldCustomAttribute2: Custom attribute 2 of the product sold.
	ProductSoldCustomAttribute2 string `json:"productSoldCustomAttribute2,omitempty"`
	// ProductSoldCustomAttribute3: Custom attribute 3 of the product sold.
	ProductSoldCustomAttribute3 string `json:"productSoldCustomAttribute3,omitempty"`
	// ProductSoldCustomAttribute4: Custom attribute 4 of the product sold.
	ProductSoldCustomAttribute4 string `json:"productSoldCustomAttribute4,omitempty"`
	// ProductSoldItemId: Item ID of the product sold.
	ProductSoldItemId string `json:"productSoldItemId,omitempty"`
	// ProductSoldTitle: Title of the product sold.
	ProductSoldTitle string `json:"productSoldTitle,omitempty"`
	// ProductSoldTypeL1: Type (level 1) of the product sold.
	ProductSoldTypeL1 string `json:"productSoldTypeL1,omitempty"`
	// ProductSoldTypeL2: Type (level 2) of the product sold.
	ProductSoldTypeL2 string `json:"productSoldTypeL2,omitempty"`
	// ProductSoldTypeL3: Type (level 3) of the product sold.
	ProductSoldTypeL3 string `json:"productSoldTypeL3,omitempty"`
	// ProductSoldTypeL4: Type (level 4) of the product sold.
	ProductSoldTypeL4 string `json:"productSoldTypeL4,omitempty"`
	// ProductSoldTypeL5: Type (level 5) of the product sold.
	ProductSoldTypeL5 string `json:"productSoldTypeL5,omitempty"`
	// ProductStoreId: Store ID of the product.
	ProductStoreId string `json:"productStoreId,omitempty"`
	// ProductTitle: Title of the product.
	ProductTitle string `json:"productTitle,omitempty"`
	// ProductTypeL1: Type (level 1) of the product.
	ProductTypeL1 string `json:"productTypeL1,omitempty"`
	// ProductTypeL2: Type (level 2) of the product.
	ProductTypeL2 string `json:"productTypeL2,omitempty"`
	// ProductTypeL3: Type (level 3) of the product.
	ProductTypeL3 string `json:"productTypeL3,omitempty"`
	// ProductTypeL4: Type (level 4) of the product.
	ProductTypeL4 string `json:"productTypeL4,omitempty"`
	// ProductTypeL5: Type (level 5) of the product.
	ProductTypeL5 string `json:"productTypeL5,omitempty"`
	// Quarter: Quarter as represented by the date of the first day of a quarter.
	// Uses the calendar year for quarters, for example, the second quarter of 2018
	// starts on 2018-04-01. Formatted as yyyy-MM-dd.
	Quarter string `json:"quarter,omitempty"`
	// RawEventConversionDimensions: The raw event conversion dimensions.
	RawEventConversionDimensions []*GoogleAdsSearchads360V0Common__Value `json:"rawEventConversionDimensions,omitempty"`
	// Week: Week as defined as Monday through Sunday, and represented by the date
	// of Monday. Formatted as yyyy-MM-dd.
	Week string `json:"week,omitempty"`
	// Year: Year, formatted as yyyy.
	Year int64 `json:"year,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdNetworkType") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdNetworkType") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__Segments) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__Segments
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__TargetCpa: 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 GoogleAdsSearchads360V0Common__TargetCpa struct {
	// CpcBidCeilingMicros: Maximum bid limit that can be set by the bid strategy.
	// The limit applies to all keywords managed by the strategy. This should only
	// be set for portfolio bid strategies.
	CpcBidCeilingMicros int64 `json:"cpcBidCeilingMicros,omitempty,string"`
	// CpcBidFloorMicros: Minimum bid limit that can be set by the bid strategy.
	// The limit applies to all keywords managed by the strategy. This should only
	// be set for portfolio bid strategies.
	CpcBidFloorMicros int64 `json:"cpcBidFloorMicros,omitempty,string"`
	// TargetCpaMicros: Average CPA target. This target should be greater than or
	// equal to minimum billable unit based on the currency for the account.
	TargetCpaMicros int64 `json:"targetCpaMicros,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "CpcBidCeilingMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CpcBidCeilingMicros") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__TargetCpa) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__TargetCpa
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__TargetCpm: Target CPM (cost per thousand
// impressions) is an automated bidding strategy that sets bids to optimize
// performance given the target CPM you set.
type GoogleAdsSearchads360V0Common__TargetCpm struct {
}

// GoogleAdsSearchads360V0Common__TargetImpressionShare: 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).
type GoogleAdsSearchads360V0Common__TargetImpressionShare struct {
	// CpcBidCeilingMicros: 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 int64 `json:"cpcBidCeilingMicros,omitempty,string"`
	// Location: The targeted location on the search results page.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ANYWHERE_ON_PAGE" - Any location on the web page.
	//   "TOP_OF_PAGE" - Top box of ads.
	//   "ABSOLUTE_TOP_OF_PAGE" - Top slot in the top box of ads.
	Location string `json:"location,omitempty"`
	// LocationFractionMicros: The chosen fraction of ads to be shown in the
	// targeted location in micros. For example, 1% equals 10,000.
	LocationFractionMicros int64 `json:"locationFractionMicros,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "CpcBidCeilingMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CpcBidCeilingMicros") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__TargetImpressionShare) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__TargetImpressionShare
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__TargetOutrankShare: An automated bidding
// strategy that sets bids based on the target fraction of auctions where the
// advertiser should outrank a specific competitor. This strategy is
// deprecated.
type GoogleAdsSearchads360V0Common__TargetOutrankShare struct {
	// CpcBidCeilingMicros: Maximum bid limit that can be set by the bid strategy.
	// The limit applies to all keywords managed by the strategy.
	CpcBidCeilingMicros int64 `json:"cpcBidCeilingMicros,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "CpcBidCeilingMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CpcBidCeilingMicros") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__TargetOutrankShare) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__TargetOutrankShare
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__TargetRestriction: The list of
// per-targeting-dimension targeting settings.
type GoogleAdsSearchads360V0Common__TargetRestriction struct {
	// BidOnly: 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 bool `json:"bidOnly,omitempty"`
	// TargetingDimension: The targeting dimension that these settings apply to.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "KEYWORD" - Keyword criteria, for example, '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.
	//   "AUDIENCE" - Audience criteria, which include user list, user interest,
	// custom affinity, and custom in market.
	//   "TOPIC" - Topic criteria for targeting categories of content, for example,
	// 'category::Animals>Pets' Used for Display and Video targeting.
	//   "GENDER" - Criteria for targeting gender.
	//   "AGE_RANGE" - Criteria for targeting age ranges.
	//   "PLACEMENT" - Placement criteria, which include websites like
	// 'www.flowers4sale.com', as well as mobile applications, mobile app
	// categories, YouTube videos, and YouTube channels.
	//   "PARENTAL_STATUS" - Criteria for parental status targeting.
	//   "INCOME_RANGE" - Criteria for income range targeting.
	TargetingDimension string `json:"targetingDimension,omitempty"`
	// ForceSendFields is a list of field names (e.g. "BidOnly") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "BidOnly") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__TargetRestriction) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__TargetRestriction
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__TargetRoas: An automated bidding strategy
// that helps you maximize revenue while averaging a specific target return on
// ad spend (ROAS).
type GoogleAdsSearchads360V0Common__TargetRoas struct {
	// CpcBidCeilingMicros: Maximum bid limit that can be set by the bid strategy.
	// The limit applies to all keywords managed by the strategy. This should only
	// be set for portfolio bid strategies.
	CpcBidCeilingMicros int64 `json:"cpcBidCeilingMicros,omitempty,string"`
	// CpcBidFloorMicros: Minimum bid limit that can be set by the bid strategy.
	// The limit applies to all keywords managed by the strategy. This should only
	// be set for portfolio bid strategies.
	CpcBidFloorMicros int64 `json:"cpcBidFloorMicros,omitempty,string"`
	// TargetRoas: Required. The chosen revenue (based on conversion data) per unit
	// of spend. Value must be between 0.01 and 1000.0, inclusive.
	TargetRoas float64 `json:"targetRoas,omitempty"`
	// ForceSendFields is a list of field names (e.g. "CpcBidCeilingMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CpcBidCeilingMicros") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__TargetRoas) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__TargetRoas
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

func (s *GoogleAdsSearchads360V0Common__TargetRoas) UnmarshalJSON(data []byte) error {
	type NoMethod GoogleAdsSearchads360V0Common__TargetRoas
	var s1 struct {
		TargetRoas gensupport.JSONFloat64 `json:"targetRoas"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.TargetRoas = float64(s1.TargetRoas)
	return nil
}

// GoogleAdsSearchads360V0Common__TargetSpend: An automated bid strategy that
// sets your bids to help get as many clicks as possible within your budget.
type GoogleAdsSearchads360V0Common__TargetSpend struct {
	// CpcBidCeilingMicros: Maximum bid limit that can be set by the bid strategy.
	// The limit applies to all keywords managed by the strategy.
	CpcBidCeilingMicros int64 `json:"cpcBidCeilingMicros,omitempty,string"`
	// TargetSpendMicros: 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. This field is deprecated and should no longer be used. See
	// https://ads-developers.googleblog.com/2020/05/reminder-about-sunset-creation-of.html
	// for details.
	TargetSpendMicros int64 `json:"targetSpendMicros,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "CpcBidCeilingMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CpcBidCeilingMicros") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__TargetSpend) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__TargetSpend
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__TargetingSetting: 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 GoogleAdsSearchads360V0Common__TargetingSetting struct {
	// TargetRestrictions: The per-targeting-dimension setting to restrict the
	// reach of your campaign or ad group.
	TargetRestrictions []*GoogleAdsSearchads360V0Common__TargetRestriction `json:"targetRestrictions,omitempty"`
	// ForceSendFields is a list of field names (e.g. "TargetRestrictions") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "TargetRestrictions") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__TargetingSetting) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__TargetingSetting
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__TextAsset: A Text asset.
type GoogleAdsSearchads360V0Common__TextAsset struct {
	// Text: Text content of the text asset.
	Text string `json:"text,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Text") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Text") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__TextAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__TextAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__TextLabel: A type of label displaying text on
// a colored background.
type GoogleAdsSearchads360V0Common__TextLabel struct {
	// BackgroundColor: 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 string `json:"backgroundColor,omitempty"`
	// Description: A short description of the label. The length must be no more
	// than 200 characters.
	Description string `json:"description,omitempty"`
	// ForceSendFields is a list of field names (e.g. "BackgroundColor") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "BackgroundColor") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__TextLabel) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__TextLabel
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__UnifiedCallAsset: A unified call asset.
type GoogleAdsSearchads360V0Common__UnifiedCallAsset struct {
	// AdScheduleTargets: List of non-overlapping schedules specifying all time
	// intervals for which the asset may serve. There can be a maximum of 6
	// schedules per day, 42 in total.
	AdScheduleTargets []*GoogleAdsSearchads360V0Common__AdScheduleInfo `json:"adScheduleTargets,omitempty"`
	// CallConversionAction: The conversion action to attribute a call conversion
	// to. If not set, the default conversion action is used. This field only has
	// effect if call_conversion_reporting_state is set to
	// USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION.
	CallConversionAction string `json:"callConversionAction,omitempty"`
	// CallConversionReportingState: Output only. Indicates whether this CallAsset
	// should use its own call conversion setting, follow the account level
	// setting, or disable call conversion.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "DISABLED" - Call conversion action is disabled.
	//   "USE_ACCOUNT_LEVEL_CALL_CONVERSION_ACTION" - Call conversion action will
	// use call conversion type set at the account level.
	//   "USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION" - Call conversion action will
	// use call conversion type set at the resource (call only ads/call extensions)
	// level.
	CallConversionReportingState string `json:"callConversionReportingState,omitempty"`
	// CallOnly: Whether the call only shows the phone number without a link to the
	// website. Applies to Microsoft Ads.
	CallOnly bool `json:"callOnly,omitempty"`
	// CallTrackingEnabled: Whether the call should be enabled on call tracking.
	// Applies to Microsoft Ads.
	CallTrackingEnabled bool `json:"callTrackingEnabled,omitempty"`
	// CountryCode: Two-letter country code of the phone number. Examples: 'US',
	// 'us'.
	CountryCode string `json:"countryCode,omitempty"`
	// EndDate: Last date of when this asset is effective and still serving, in
	// yyyy-MM-dd format.
	EndDate string `json:"endDate,omitempty"`
	// PhoneNumber: The advertiser's raw phone number. Examples: '1234567890',
	// '(123)456-7890'
	PhoneNumber string `json:"phoneNumber,omitempty"`
	// StartDate: Start date of when this asset is effective and can begin serving,
	// in yyyy-MM-dd format.
	StartDate string `json:"startDate,omitempty"`
	// UseSearcherTimeZone: Whether to show the call extension in search user's
	// time zone. Applies to Microsoft Ads.
	UseSearcherTimeZone bool `json:"useSearcherTimeZone,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdScheduleTargets") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdScheduleTargets") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__UnifiedCallAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__UnifiedCallAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__UnifiedCalloutAsset: A unified callout asset.
type GoogleAdsSearchads360V0Common__UnifiedCalloutAsset struct {
	// AdScheduleTargets: List of non-overlapping schedules specifying all time
	// intervals for which the asset may serve. There can be a maximum of 6
	// schedules per day, 42 in total.
	AdScheduleTargets []*GoogleAdsSearchads360V0Common__AdScheduleInfo `json:"adScheduleTargets,omitempty"`
	// CalloutText: The callout text. The length of this string should be between 1
	// and 25, inclusive.
	CalloutText string `json:"calloutText,omitempty"`
	// EndDate: Last date of when this asset is effective and still serving, in
	// yyyy-MM-dd format.
	EndDate string `json:"endDate,omitempty"`
	// StartDate: Start date of when this asset is effective and can begin serving,
	// in yyyy-MM-dd format.
	StartDate string `json:"startDate,omitempty"`
	// UseSearcherTimeZone: Whether to show the asset in search user's time zone.
	// Applies to Microsoft Ads.
	UseSearcherTimeZone bool `json:"useSearcherTimeZone,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdScheduleTargets") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdScheduleTargets") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__UnifiedCalloutAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__UnifiedCalloutAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__UnifiedLocationAsset: A unified location
// asset.
type GoogleAdsSearchads360V0Common__UnifiedLocationAsset struct {
	// BusinessProfileLocations: The list of business locations for the customer.
	// This will only be returned if the Location Asset is syncing from the
	// Business Profile account. It is possible to have multiple Business Profile
	// listings under the same account that point to the same Place ID.
	BusinessProfileLocations []*GoogleAdsSearchads360V0Common__BusinessProfileLocation `json:"businessProfileLocations,omitempty"`
	// LocationOwnershipType: The type of location ownership. If the type is
	// BUSINESS_OWNER, it will be served as a location extension. If the type is
	// AFFILIATE, it will be served as an affiliate location.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "BUSINESS_OWNER" - Business Owner of location(legacy location extension -
	// LE).
	//   "AFFILIATE" - Affiliate location(Third party location extension - ALE).
	LocationOwnershipType string `json:"locationOwnershipType,omitempty"`
	// PlaceId: Place IDs uniquely identify a place in the Google Places database
	// and on Google Maps. This field is unique for a given customer ID and asset
	// type. See https://developers.google.com/places/web-service/place-id to learn
	// more about Place ID.
	PlaceId string `json:"placeId,omitempty"`
	// ForceSendFields is a list of field names (e.g. "BusinessProfileLocations")
	// to unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "BusinessProfileLocations") to
	// include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__UnifiedLocationAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__UnifiedLocationAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__UnifiedPageFeedAsset: A Unified Page Feed
// asset.
type GoogleAdsSearchads360V0Common__UnifiedPageFeedAsset struct {
	// Labels: Labels used to group the page urls.
	Labels []string `json:"labels,omitempty"`
	// PageUrl: The webpage that advertisers want to target.
	PageUrl string `json:"pageUrl,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Labels") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Labels") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__UnifiedPageFeedAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__UnifiedPageFeedAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__UnifiedSitelinkAsset: A unified sitelink
// asset.
type GoogleAdsSearchads360V0Common__UnifiedSitelinkAsset struct {
	// AdScheduleTargets: List of non-overlapping schedules specifying all time
	// intervals for which the asset may serve. There can be a maximum of 6
	// schedules per day, 42 in total.
	AdScheduleTargets []*GoogleAdsSearchads360V0Common__AdScheduleInfo `json:"adScheduleTargets,omitempty"`
	// Description1: First line of the description for the sitelink. If set, the
	// length should be between 1 and 35, inclusive, and description2 must also be
	// set.
	Description1 string `json:"description1,omitempty"`
	// Description2: Second line of the description for the sitelink. If set, the
	// length should be between 1 and 35, inclusive, and description1 must also be
	// set.
	Description2 string `json:"description2,omitempty"`
	// EndDate: Last date of when this asset is effective and still serving, in
	// yyyy-MM-dd format.
	EndDate string `json:"endDate,omitempty"`
	// LinkText: URL display text for the sitelink. The length of this string
	// should be between 1 and 25, inclusive.
	LinkText string `json:"linkText,omitempty"`
	// MobilePreferred: Whether the preference is for the sitelink asset to be
	// displayed on mobile devices. Applies to Microsoft Ads.
	MobilePreferred bool `json:"mobilePreferred,omitempty"`
	// StartDate: Start date of when this asset is effective and can begin serving,
	// in yyyy-MM-dd format.
	StartDate string `json:"startDate,omitempty"`
	// TrackingId: ID used for tracking clicks for the sitelink asset. This is a
	// Yahoo! Japan only field.
	TrackingId int64 `json:"trackingId,omitempty,string"`
	// UseSearcherTimeZone: Whether to show the sitelink asset in search user's
	// time zone. Applies to Microsoft Ads.
	UseSearcherTimeZone bool `json:"useSearcherTimeZone,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdScheduleTargets") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdScheduleTargets") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__UnifiedSitelinkAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__UnifiedSitelinkAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__UserListInfo: A User List criterion.
// Represents a user list that is defined by the advertiser to be targeted.
type GoogleAdsSearchads360V0Common__UserListInfo struct {
	// UserList: The User List resource name.
	UserList string `json:"userList,omitempty"`
	// ForceSendFields is a list of field names (e.g. "UserList") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "UserList") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__UserListInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__UserListInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__Value: A generic data container.
type GoogleAdsSearchads360V0Common__Value struct {
	// BooleanValue: A boolean.
	BooleanValue bool `json:"booleanValue,omitempty"`
	// DoubleValue: A double.
	DoubleValue float64 `json:"doubleValue,omitempty"`
	// FloatValue: A float.
	FloatValue float64 `json:"floatValue,omitempty"`
	// Int64Value: An int64.
	Int64Value int64 `json:"int64Value,omitempty,string"`
	// StringValue: A string.
	StringValue string `json:"stringValue,omitempty"`
	// ForceSendFields is a list of field names (e.g. "BooleanValue") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "BooleanValue") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__Value) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__Value
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

func (s *GoogleAdsSearchads360V0Common__Value) UnmarshalJSON(data []byte) error {
	type NoMethod GoogleAdsSearchads360V0Common__Value
	var s1 struct {
		DoubleValue gensupport.JSONFloat64 `json:"doubleValue"`
		FloatValue  gensupport.JSONFloat64 `json:"floatValue"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.DoubleValue = float64(s1.DoubleValue)
	s.FloatValue = float64(s1.FloatValue)
	return nil
}

// GoogleAdsSearchads360V0Common__WebpageConditionInfo: Logical expression for
// targeting webpages of an advertiser's website.
type GoogleAdsSearchads360V0Common__WebpageConditionInfo struct {
	// Argument: Argument of webpage targeting condition.
	Argument string `json:"argument,omitempty"`
	// Operand: Operand of webpage targeting condition.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "URL" - Operand denoting a webpage URL targeting condition.
	//   "CATEGORY" - Operand denoting a webpage category targeting condition.
	//   "PAGE_TITLE" - Operand denoting a webpage title targeting condition.
	//   "PAGE_CONTENT" - Operand denoting a webpage content targeting condition.
	//   "CUSTOM_LABEL" - Operand denoting a webpage custom label targeting
	// condition.
	Operand string `json:"operand,omitempty"`
	// Operator: Operator of webpage targeting condition.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "EQUALS" - The argument web condition is equal to the compared web
	// condition.
	//   "CONTAINS" - The argument web condition is part of the compared web
	// condition.
	Operator string `json:"operator,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Argument") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Argument") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__WebpageConditionInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__WebpageConditionInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Common__WebpageInfo: Represents a criterion for
// targeting webpages of an advertiser's website.
type GoogleAdsSearchads360V0Common__WebpageInfo struct {
	// Conditions: Conditions, or logical expressions, for webpage targeting. The
	// list of webpage targeting conditions are and-ed together when evaluated for
	// targeting. An empty list of conditions indicates all pages of the campaign's
	// website are targeted. This field is required for CREATE operations and is
	// prohibited on UPDATE operations.
	Conditions []*GoogleAdsSearchads360V0Common__WebpageConditionInfo `json:"conditions,omitempty"`
	// CoveragePercentage: Website criteria coverage percentage. This is the
	// computed percentage of website coverage based on the website target,
	// negative website target and negative keywords in the ad group and campaign.
	// For instance, when coverage returns as 1, it indicates it has 100% coverage.
	// This field is read-only.
	CoveragePercentage float64 `json:"coveragePercentage,omitempty"`
	// CriterionName: 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 string `json:"criterionName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Conditions") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Conditions") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__WebpageInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__WebpageInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

func (s *GoogleAdsSearchads360V0Common__WebpageInfo) UnmarshalJSON(data []byte) error {
	type NoMethod GoogleAdsSearchads360V0Common__WebpageInfo
	var s1 struct {
		CoveragePercentage gensupport.JSONFloat64 `json:"coveragePercentage"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.CoveragePercentage = float64(s1.CoveragePercentage)
	return nil
}

// GoogleAdsSearchads360V0Common__YoutubeVideoAsset: A YouTube asset.
type GoogleAdsSearchads360V0Common__YoutubeVideoAsset struct {
	// YoutubeVideoId: YouTube video id. This is the 11 character string value used
	// in the YouTube video URL.
	YoutubeVideoId string `json:"youtubeVideoId,omitempty"`
	// YoutubeVideoTitle: YouTube video title.
	YoutubeVideoTitle string `json:"youtubeVideoTitle,omitempty"`
	// ForceSendFields is a list of field names (e.g. "YoutubeVideoId") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "YoutubeVideoId") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Common__YoutubeVideoAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Common__YoutubeVideoAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ErrorsErrorLocationFieldPathElement: A part of a
// field path.
type GoogleAdsSearchads360V0ErrorsErrorLocationFieldPathElement struct {
	// FieldName: The name of a field or a oneof
	FieldName string `json:"fieldName,omitempty"`
	// Index: If field_name is a repeated field, this is the element that failed
	Index int64 `json:"index,omitempty"`
	// ForceSendFields is a list of field names (e.g. "FieldName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "FieldName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ErrorsErrorLocationFieldPathElement) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ErrorsErrorLocationFieldPathElement
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Errors__ErrorCode: The error reason represented by
// type and enum.
type GoogleAdsSearchads360V0Errors__ErrorCode struct {
	// AuthenticationError: Indicates failure to properly authenticate user.
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "AUTHENTICATION_ERROR" - Authentication of the request failed.
	//   "CLIENT_CUSTOMER_ID_INVALID" - Client customer ID is not a number.
	//   "CUSTOMER_NOT_FOUND" - No customer found for the provided customer ID.
	//   "GOOGLE_ACCOUNT_DELETED" - Client's Google account is deleted.
	//   "GOOGLE_ACCOUNT_COOKIE_INVALID" - Account login token in the cookie is
	// invalid.
	//   "GOOGLE_ACCOUNT_AUTHENTICATION_FAILED" - A problem occurred during Google
	// account authentication.
	//   "GOOGLE_ACCOUNT_USER_AND_ADS_USER_MISMATCH" - The user in the Google
	// account login token does not match the user ID in the cookie.
	//   "LOGIN_COOKIE_REQUIRED" - Login cookie is required for authentication.
	//   "NOT_ADS_USER" - The Google account that generated the OAuth access token
	// is not associated with a Search Ads 360 account. Create a new account, or
	// add the Google account to an existing Search Ads 360 account.
	//   "OAUTH_TOKEN_INVALID" - OAuth token in the header is not valid.
	//   "OAUTH_TOKEN_EXPIRED" - OAuth token in the header has expired.
	//   "OAUTH_TOKEN_DISABLED" - OAuth token in the header has been disabled.
	//   "OAUTH_TOKEN_REVOKED" - OAuth token in the header has been revoked.
	//   "OAUTH_TOKEN_HEADER_INVALID" - OAuth token HTTP header is malformed.
	//   "LOGIN_COOKIE_INVALID" - Login cookie is not valid.
	//   "USER_ID_INVALID" - User ID in the header is not a valid ID.
	//   "TWO_STEP_VERIFICATION_NOT_ENROLLED" - An account administrator changed
	// this account's authentication settings. To access this account, enable
	// 2-Step Verification in your Google account at
	// https://www.google.com/landing/2step.
	//   "ADVANCED_PROTECTION_NOT_ENROLLED" - An account administrator changed this
	// account's authentication settings. To access this account, enable Advanced
	// Protection in your Google account at
	// https://landing.google.com/advancedprotection.
	AuthenticationError string `json:"authenticationError,omitempty"`
	// AuthorizationError: An error encountered when trying to authorize a user.
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "USER_PERMISSION_DENIED" - 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/search-ads/reporting/concepts/call-structure#login_customer_id_header
	//   "PROJECT_DISABLED" - The Google Cloud project sent in the request does not
	// have permission to access the api.
	//   "AUTHORIZATION_ERROR" - Authorization of the client failed.
	//   "ACTION_NOT_PERMITTED" - The user does not have permission to perform this
	// action (for example, ADD, UPDATE, REMOVE) on the resource or call a method.
	//   "INCOMPLETE_SIGNUP" - Signup not complete.
	//   "CUSTOMER_NOT_ENABLED" - The customer account can't be accessed because it
	// is not yet enabled or has been deactivated.
	//   "MISSING_TOS" - The developer must sign the terms of service. They can be
	// found here: https://developers.google.com/terms
	//   "INVALID_LOGIN_CUSTOMER_ID_SERVING_CUSTOMER_ID_COMBINATION" - The login
	// customer specified does not have access to the account specified, so the
	// request is invalid.
	//   "SERVICE_ACCESS_DENIED" - The developer specified does not have access to
	// the service.
	//   "ACCESS_DENIED_FOR_ACCOUNT_TYPE" - The customer (or login customer) isn't
	// allowed in Search Ads 360 API. It belongs to another ads system.
	//   "METRIC_ACCESS_DENIED" - The developer does not have access to the metrics
	// queried.
	AuthorizationError string `json:"authorizationError,omitempty"`
	// CustomColumnError: The reasons for the custom column error
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "CUSTOM_COLUMN_NOT_FOUND" - The custom column has not been found.
	//   "CUSTOM_COLUMN_NOT_AVAILABLE" - The custom column is not available.
	CustomColumnError string `json:"customColumnError,omitempty"`
	// DateError: The reasons for the date error
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "INVALID_FIELD_VALUES_IN_DATE" - Given field values do not correspond to a
	// valid date.
	//   "INVALID_FIELD_VALUES_IN_DATE_TIME" - Given field values do not correspond
	// to a valid date time.
	//   "INVALID_STRING_DATE" - The string date's format should be yyyy-mm-dd.
	//   "INVALID_STRING_DATE_TIME_MICROS" - The string date time's format should
	// be yyyy-mm-dd hh:mm:ss.ssssss.
	//   "INVALID_STRING_DATE_TIME_SECONDS" - The string date time's format should
	// be yyyy-mm-dd hh:mm:ss.
	//   "INVALID_STRING_DATE_TIME_SECONDS_WITH_OFFSET" - The string date time's
	// format should be yyyy-mm-dd hh:mm:ss+|-hh:mm.
	//   "EARLIER_THAN_MINIMUM_DATE" - Date is before allowed minimum.
	//   "LATER_THAN_MAXIMUM_DATE" - Date is after allowed maximum.
	//   "DATE_RANGE_MINIMUM_DATE_LATER_THAN_MAXIMUM_DATE" - Date range bounds are
	// not in order.
	//   "DATE_RANGE_MINIMUM_AND_MAXIMUM_DATES_BOTH_NULL" - Both dates in range are
	// null.
	DateError string `json:"dateError,omitempty"`
	// DateRangeError: The reasons for the date range error
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "INVALID_DATE" - Invalid date.
	//   "START_DATE_AFTER_END_DATE" - The start date was after the end date.
	//   "CANNOT_SET_DATE_TO_PAST" - Cannot set date to past time
	//   "AFTER_MAXIMUM_ALLOWABLE_DATE" - A date was used that is past the system
	// "last" date.
	//   "CANNOT_MODIFY_START_DATE_IF_ALREADY_STARTED" - Trying to change start
	// date on a resource that has started.
	DateRangeError string `json:"dateRangeError,omitempty"`
	// DistinctError: The reasons for the distinct error
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "DUPLICATE_ELEMENT" - Duplicate element.
	//   "DUPLICATE_TYPE" - Duplicate type.
	DistinctError string `json:"distinctError,omitempty"`
	// HeaderError: The reasons for the header error.
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "INVALID_USER_SELECTED_CUSTOMER_ID" - The user selected customer ID could
	// not be validated.
	//   "INVALID_LOGIN_CUSTOMER_ID" - The login customer ID could not be
	// validated.
	HeaderError string `json:"headerError,omitempty"`
	// InternalError: An unexpected server-side error.
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "INTERNAL_ERROR" - API encountered unexpected internal error.
	//   "ERROR_CODE_NOT_PUBLISHED" - The intended error code doesn't exist in
	// specified API version. It will be released in a future API version.
	//   "TRANSIENT_ERROR" - API encountered an unexpected transient error. The
	// user should retry their request in these cases.
	//   "DEADLINE_EXCEEDED" - The request took longer than a deadline.
	InternalError string `json:"internalError,omitempty"`
	// InvalidParameterError: The reasons for invalid parameter errors.
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "INVALID_CURRENCY_CODE" - The specified currency code is invalid.
	InvalidParameterError string `json:"invalidParameterError,omitempty"`
	// QueryError: An error with the query
	//
	// Possible values:
	//   "UNSPECIFIED" - Name unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "QUERY_ERROR" - Returned if all other query error reasons are not
	// applicable.
	//   "BAD_ENUM_CONSTANT" - A condition used in the query references an invalid
	// enum constant.
	//   "BAD_ESCAPE_SEQUENCE" - Query contains an invalid escape sequence.
	//   "BAD_FIELD_NAME" - Field name is invalid.
	//   "BAD_LIMIT_VALUE" - Limit value is invalid (for example, not a number)
	//   "BAD_NUMBER" - Encountered number can not be parsed.
	//   "BAD_OPERATOR" - Invalid operator encountered.
	//   "BAD_PARAMETER_NAME" - Parameter unknown or not supported.
	//   "BAD_PARAMETER_VALUE" - Parameter have invalid value.
	//   "BAD_RESOURCE_TYPE_IN_FROM_CLAUSE" - Invalid resource type was specified
	// in the FROM clause.
	//   "BAD_SYMBOL" - Non-ASCII symbol encountered outside of strings.
	//   "BAD_VALUE" - Value is invalid.
	//   "DATE_RANGE_TOO_WIDE" - Date filters fail to restrict date to a range
	// smaller than 31 days. Applicable if the query is segmented by date.
	//   "DATE_RANGE_TOO_NARROW" - Filters on date/week/month/quarter have a start
	// date after end date.
	//   "EXPECTED_AND" - Expected AND between values with BETWEEN operator.
	//   "EXPECTED_BY" - Expecting ORDER BY to have BY.
	//   "EXPECTED_DIMENSION_FIELD_IN_SELECT_CLAUSE" - There was no dimension field
	// selected.
	//   "EXPECTED_FILTERS_ON_DATE_RANGE" - Missing filters on date related fields.
	//   "EXPECTED_FROM" - Missing FROM clause.
	//   "EXPECTED_LIST" - The operator used in the conditions requires the value
	// to be a list.
	//   "EXPECTED_REFERENCED_FIELD_IN_SELECT_CLAUSE" - Fields used in WHERE or
	// ORDER BY clauses are missing from the SELECT clause.
	//   "EXPECTED_SELECT" - SELECT is missing at the beginning of query.
	//   "EXPECTED_SINGLE_VALUE" - A list was passed as a value to a condition
	// whose operator expects a single value.
	//   "EXPECTED_VALUE_WITH_BETWEEN_OPERATOR" - Missing one or both values with
	// BETWEEN operator.
	//   "INVALID_DATE_FORMAT" - Invalid date format. Expected 'YYYY-MM-DD'.
	//   "MISALIGNED_DATE_FOR_FILTER" - Misaligned date value for the filter. The
	// date should be the start of a week/month/quarter if the filtered field is
	// segments.week/segments.month/segments.quarter.
	//   "INVALID_STRING_VALUE" - Value passed was not a string when it should have
	// been. For example, it was a number or unquoted literal.
	//   "INVALID_VALUE_WITH_BETWEEN_OPERATOR" - A String value passed to the
	// BETWEEN operator does not parse as a date.
	//   "INVALID_VALUE_WITH_DURING_OPERATOR" - The value passed to the DURING
	// operator is not a Date range literal
	//   "INVALID_VALUE_WITH_LIKE_OPERATOR" - A value was passed to the LIKE
	// operator.
	//   "OPERATOR_FIELD_MISMATCH" - An operator was provided that is inapplicable
	// to the field being filtered.
	//   "PROHIBITED_EMPTY_LIST_IN_CONDITION" - A Condition was found with an empty
	// list.
	//   "PROHIBITED_ENUM_CONSTANT" - A condition used in the query references an
	// unsupported enum constant.
	//   "PROHIBITED_FIELD_COMBINATION_IN_SELECT_CLAUSE" - Fields that are not
	// allowed to be selected together were included in the SELECT clause.
	//   "PROHIBITED_FIELD_IN_ORDER_BY_CLAUSE" - A field that is not orderable was
	// included in the ORDER BY clause.
	//   "PROHIBITED_FIELD_IN_SELECT_CLAUSE" - A field that is not selectable was
	// included in the SELECT clause.
	//   "PROHIBITED_FIELD_IN_WHERE_CLAUSE" - A field that is not filterable was
	// included in the WHERE clause.
	//   "PROHIBITED_RESOURCE_TYPE_IN_FROM_CLAUSE" - Resource type specified in the
	// FROM clause is not supported by this service.
	//   "PROHIBITED_RESOURCE_TYPE_IN_SELECT_CLAUSE" - A field that comes from an
	// incompatible resource was included in the SELECT clause.
	//   "PROHIBITED_RESOURCE_TYPE_IN_WHERE_CLAUSE" - A field that comes from an
	// incompatible resource was included in the WHERE clause.
	//   "PROHIBITED_METRIC_IN_SELECT_OR_WHERE_CLAUSE" - A metric incompatible with
	// the main resource or other selected segmenting resources was included in the
	// SELECT or WHERE clause.
	//   "PROHIBITED_SEGMENT_IN_SELECT_OR_WHERE_CLAUSE" - A segment incompatible
	// with the main resource or other selected segmenting resources was included
	// in the SELECT or WHERE clause.
	//   "PROHIBITED_SEGMENT_WITH_METRIC_IN_SELECT_OR_WHERE_CLAUSE" - A segment in
	// the SELECT clause is incompatible with a metric in the SELECT or WHERE
	// clause.
	//   "LIMIT_VALUE_TOO_LOW" - The value passed to the limit clause is too low.
	//   "PROHIBITED_NEWLINE_IN_STRING" - Query has a string containing a newline
	// character.
	//   "PROHIBITED_VALUE_COMBINATION_IN_LIST" - List contains values of different
	// types.
	//   "PROHIBITED_VALUE_COMBINATION_WITH_BETWEEN_OPERATOR" - The values passed
	// to the BETWEEN operator are not of the same type.
	//   "STRING_NOT_TERMINATED" - Query contains unterminated string.
	//   "TOO_MANY_SEGMENTS" - Too many segments are specified in SELECT clause.
	//   "UNEXPECTED_END_OF_QUERY" - Query is incomplete and cannot be parsed.
	//   "UNEXPECTED_FROM_CLAUSE" - FROM clause cannot be specified in this query.
	//   "UNRECOGNIZED_FIELD" - Query contains one or more unrecognized fields.
	//   "UNEXPECTED_INPUT" - Query has an unexpected extra part.
	//   "REQUESTED_METRICS_FOR_MANAGER" - Metrics cannot be requested for a
	// manager account. To retrieve metrics, issue separate requests against each
	// client account under the manager account.
	//   "FILTER_HAS_TOO_MANY_VALUES" - The number of values (right-hand-side
	// operands) in a filter exceeds the limit.
	QueryError string `json:"queryError,omitempty"`
	// QuotaError: An error with the amount of quota remaining.
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "RESOURCE_EXHAUSTED" - Too many requests.
	//   "RESOURCE_TEMPORARILY_EXHAUSTED" - Too many requests in a short amount of
	// time.
	QuotaError string `json:"quotaError,omitempty"`
	// RequestError: An error caused by the request
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "RESOURCE_NAME_MISSING" - Resource name is required for this request.
	//   "RESOURCE_NAME_MALFORMED" - Resource name provided is malformed.
	//   "BAD_RESOURCE_ID" - Resource name provided is malformed.
	//   "INVALID_PRODUCT_NAME" - Product name is invalid.
	//   "INVALID_CUSTOMER_ID" - Customer ID is invalid.
	//   "OPERATION_REQUIRED" - Mutate operation should have either create, update,
	// or remove specified.
	//   "RESOURCE_NOT_FOUND" - Requested resource not found.
	//   "INVALID_PAGE_TOKEN" - Next page token specified in user request is
	// invalid.
	//   "EXPIRED_PAGE_TOKEN" - Next page token specified in user request has
	// expired.
	//   "INVALID_PAGE_SIZE" - Page size specified in user request is invalid.
	//   "REQUIRED_FIELD_MISSING" - Required field is missing.
	//   "IMMUTABLE_FIELD" - 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'.
	//   "TOO_MANY_MUTATE_OPERATIONS" - Received too many entries in request.
	//   "CANNOT_BE_EXECUTED_BY_MANAGER_ACCOUNT" - Request cannot be executed by a
	// manager account.
	//   "CANNOT_MODIFY_FOREIGN_FIELD" - 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.
	//   "INVALID_ENUM_VALUE" - Enum value is not permitted.
	//   "LOGIN_CUSTOMER_ID_PARAMETER_MISSING" - The login-customer-id parameter is
	// required for this request.
	//   "LOGIN_OR_LINKED_CUSTOMER_ID_PARAMETER_REQUIRED" - Either
	// login-customer-id or linked-customer-id parameter is required for this
	// request.
	//   "VALIDATE_ONLY_REQUEST_HAS_PAGE_TOKEN" - page_token is set in the validate
	// only request
	//   "CANNOT_RETURN_SUMMARY_ROW_FOR_REQUEST_WITHOUT_METRICS" -
	// return_summary_row cannot be enabled if request did not select any metrics
	// field.
	//   "CANNOT_RETURN_SUMMARY_ROW_FOR_VALIDATE_ONLY_REQUESTS" -
	// return_summary_row should not be enabled for validate only requests.
	//   "INCONSISTENT_RETURN_SUMMARY_ROW_VALUE" - return_summary_row parameter
	// value should be the same between requests with page_token field set and
	// their original request.
	//   "TOTAL_RESULTS_COUNT_NOT_ORIGINALLY_REQUESTED" - The total results count
	// cannot be returned if it was not requested in the original request.
	//   "RPC_DEADLINE_TOO_SHORT" - Deadline specified by the client was too short.
	//   "PRODUCT_NOT_SUPPORTED" - The product associated with the request is not
	// supported for the current request.
	RequestError string `json:"requestError,omitempty"`
	// SizeLimitError: The reasons for the size limit error
	//
	// Possible values:
	//   "UNSPECIFIED" - Enum unspecified.
	//   "UNKNOWN" - The received error code is not known in this version.
	//   "REQUEST_SIZE_LIMIT_EXCEEDED" - The number of entries in the request
	// exceeds the system limit, or the contents of the operations exceed
	// transaction limits due to their size or complexity. Try reducing the number
	// of entries per request.
	//   "RESPONSE_SIZE_LIMIT_EXCEEDED" - The number of entries in the response
	// exceeds the system limit.
	SizeLimitError string `json:"sizeLimitError,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AuthenticationError") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AuthenticationError") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Errors__ErrorCode) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Errors__ErrorCode
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Errors__ErrorDetails: Additional error details.
type GoogleAdsSearchads360V0Errors__ErrorDetails struct {
	// QuotaErrorDetails: Details on the quota error, including the scope (account
	// or developer), the rate bucket name and the retry delay.
	QuotaErrorDetails *GoogleAdsSearchads360V0Errors__QuotaErrorDetails `json:"quotaErrorDetails,omitempty"`
	// UnpublishedErrorCode: The error code that should have been returned, but
	// wasn't. This is used when the error code is not published in the client
	// specified version.
	UnpublishedErrorCode string `json:"unpublishedErrorCode,omitempty"`
	// ForceSendFields is a list of field names (e.g. "QuotaErrorDetails") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "QuotaErrorDetails") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Errors__ErrorDetails) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Errors__ErrorDetails
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Errors__ErrorLocation: Describes the part of the
// request proto that caused the error.
type GoogleAdsSearchads360V0Errors__ErrorLocation struct {
	// FieldPathElements: A field path that indicates which field was invalid in
	// the request.
	FieldPathElements []*GoogleAdsSearchads360V0ErrorsErrorLocationFieldPathElement `json:"fieldPathElements,omitempty"`
	// ForceSendFields is a list of field names (e.g. "FieldPathElements") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "FieldPathElements") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Errors__ErrorLocation) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Errors__ErrorLocation
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Errors__QuotaErrorDetails: Additional quota error
// details when there is QuotaError.
type GoogleAdsSearchads360V0Errors__QuotaErrorDetails struct {
	// RateName: The high level description of the quota bucket. Examples are "Get
	// requests for standard access" or "Requests per account".
	RateName string `json:"rateName,omitempty"`
	// RateScope: The rate scope of the quota limit.
	//
	// Possible values:
	//   "UNSPECIFIED" - Unspecified enum
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ACCOUNT" - Per customer account quota
	//   "DEVELOPER" - Per project quota
	RateScope string `json:"rateScope,omitempty"`
	// RetryDelay: Backoff period that customers should wait before sending next
	// request.
	RetryDelay string `json:"retryDelay,omitempty"`
	// ForceSendFields is a list of field names (e.g. "RateName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "RateName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Errors__QuotaErrorDetails) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Errors__QuotaErrorDetails
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Errors__SearchAds360Error: SearchAds360-specific
// error.
type GoogleAdsSearchads360V0Errors__SearchAds360Error struct {
	// Details: Additional error details, which are returned by certain error
	// codes. Most error codes do not include details.
	Details *GoogleAdsSearchads360V0Errors__ErrorDetails `json:"details,omitempty"`
	// ErrorCode: An enum value that indicates which error occurred.
	ErrorCode *GoogleAdsSearchads360V0Errors__ErrorCode `json:"errorCode,omitempty"`
	// Location: Describes the part of the request proto that caused the error.
	Location *GoogleAdsSearchads360V0Errors__ErrorLocation `json:"location,omitempty"`
	// Message: A human-readable description of the error.
	Message string `json:"message,omitempty"`
	// Trigger: The value that triggered the error.
	Trigger *GoogleAdsSearchads360V0Common__Value `json:"trigger,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Details") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Details") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Errors__SearchAds360Error) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Errors__SearchAds360Error
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Errors__SearchAds360Failure: Describes how a Search
// Ads 360 API call failed. It's returned inside google.rpc.Status.details when
// a call fails.
type GoogleAdsSearchads360V0Errors__SearchAds360Failure struct {
	// Errors: The list of errors that occurred.
	Errors []*GoogleAdsSearchads360V0Errors__SearchAds360Error `json:"errors,omitempty"`
	// RequestId: The unique ID of the request that is used for debugging purposes.
	RequestId string `json:"requestId,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Errors") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Errors") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Errors__SearchAds360Failure) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Errors__SearchAds360Failure
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversionVa
// lue: An automated bidding strategy to help get the most conversion value for
// your campaigns while spending your budget.
type GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversionValue struct {
	// TargetRoas: Output only. 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 float64 `json:"targetRoas,omitempty"`
	// ForceSendFields is a list of field names (e.g. "TargetRoas") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "TargetRoas") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversionValue) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversionValue
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

func (s *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversionValue) UnmarshalJSON(data []byte) error {
	type NoMethod GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversionValue
	var s1 struct {
		TargetRoas gensupport.JSONFloat64 `json:"targetRoas"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.TargetRoas = float64(s1.TargetRoas)
	return nil
}

// GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversions:
//
//	An automated bidding strategy to help get the most conversions for your
//
// campaigns while spending your budget.
type GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversions struct {
	// TargetCpa: Output only. The target cost per acquisition (CPA) option. This
	// is the average amount that you would like to spend per acquisition.
	TargetCpa int64 `json:"targetCpa,omitempty,string"`
	// TargetCpaMicros: Output only. The target cost per acquisition (CPA) option.
	// This is the average amount that you would like to spend per acquisition.
	TargetCpaMicros int64 `json:"targetCpaMicros,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "TargetCpa") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "TargetCpa") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversions) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversions
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetCpa: 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 GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetCpa struct {
	// TargetCpaMicros: Output only. Average CPA target. This target should be
	// greater than or equal to minimum billable unit based on the currency for the
	// account.
	TargetCpaMicros int64 `json:"targetCpaMicros,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "TargetCpaMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "TargetCpaMicros") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetCpa) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetCpa
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetImpressionShar
// e: 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).
type GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetImpressionShare struct {
	// CpcBidCeilingMicros: Output only. 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 int64 `json:"cpcBidCeilingMicros,omitempty,string"`
	// Location: Output only. The targeted location on the search results page.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ANYWHERE_ON_PAGE" - Any location on the web page.
	//   "TOP_OF_PAGE" - Top box of ads.
	//   "ABSOLUTE_TOP_OF_PAGE" - Top slot in the top box of ads.
	Location string `json:"location,omitempty"`
	// LocationFractionMicros: The chosen fraction of ads to be shown in the
	// targeted location in micros. For example, 1% equals 10,000.
	LocationFractionMicros int64 `json:"locationFractionMicros,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "CpcBidCeilingMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CpcBidCeilingMicros") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetImpressionShare) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetImpressionShare
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetRoas: An
// automated bidding strategy that helps you maximize revenue while averaging a
// specific target return on ad spend (ROAS).
type GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetRoas struct {
	// TargetRoas: Output only. The chosen revenue (based on conversion data) per
	// unit of spend.
	TargetRoas float64 `json:"targetRoas,omitempty"`
	// ForceSendFields is a list of field names (e.g. "TargetRoas") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "TargetRoas") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetRoas) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetRoas
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

func (s *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetRoas) UnmarshalJSON(data []byte) error {
	type NoMethod GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetRoas
	var s1 struct {
		TargetRoas gensupport.JSONFloat64 `json:"targetRoas"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.TargetRoas = float64(s1.TargetRoas)
	return nil
}

// GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetSpend: An
// automated bid strategy that sets your bids to help get as many clicks as
// possible within your budget.
type GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetSpend struct {
	// CpcBidCeilingMicros: Output only. Maximum bid limit that can be set by the
	// bid strategy. The limit applies to all keywords managed by the strategy.
	CpcBidCeilingMicros int64 `json:"cpcBidCeilingMicros,omitempty,string"`
	// TargetSpendMicros: Output only. 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. This field is deprecated and should no longer be used.
	// See
	// https://ads-developers.googleblog.com/2020/05/reminder-about-sunset-creation-of.html
	// for details.
	TargetSpendMicros int64 `json:"targetSpendMicros,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "CpcBidCeilingMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CpcBidCeilingMicros") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetSpend) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetSpend
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesAdGroupCriterionPositionEstimates: Estimates
// for criterion bids at various positions.
type GoogleAdsSearchads360V0ResourcesAdGroupCriterionPositionEstimates struct {
	// TopOfPageCpcMicros: Output only. The estimate of the CPC bid required for ad
	// to be displayed at the top of the first page of search results.
	TopOfPageCpcMicros int64 `json:"topOfPageCpcMicros,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "TopOfPageCpcMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "TopOfPageCpcMicros") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesAdGroupCriterionPositionEstimates) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesAdGroupCriterionPositionEstimates
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesAdGroupCriterionQualityInfo: A container for
// ad group criterion quality information.
type GoogleAdsSearchads360V0ResourcesAdGroupCriterionQualityInfo struct {
	// QualityScore: Output only. The quality score. This field may not be
	// populated if Google does not have enough information to determine a value.
	QualityScore int64 `json:"qualityScore,omitempty"`
	// ForceSendFields is a list of field names (e.g. "QualityScore") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "QualityScore") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesAdGroupCriterionQualityInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesAdGroupCriterionQualityInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesCampaignDynamicSearchAdsSetting: The setting
// for controlling Dynamic Search Ads (DSA).
type GoogleAdsSearchads360V0ResourcesCampaignDynamicSearchAdsSetting struct {
	// DomainName: Required. The Internet domain name that this setting represents,
	// for example, "google.com" or "www.google.com".
	DomainName string `json:"domainName,omitempty"`
	// LanguageCode: Required. The language code specifying the language of the
	// domain, for example, "en".
	LanguageCode string `json:"languageCode,omitempty"`
	// UseSuppliedUrlsOnly: Whether the campaign uses advertiser supplied URLs
	// exclusively.
	UseSuppliedUrlsOnly bool `json:"useSuppliedUrlsOnly,omitempty"`
	// ForceSendFields is a list of field names (e.g. "DomainName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "DomainName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesCampaignDynamicSearchAdsSetting) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesCampaignDynamicSearchAdsSetting
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesCampaignGeoTargetTypeSetting: Represents a
// collection of settings related to ads geotargeting.
type GoogleAdsSearchads360V0ResourcesCampaignGeoTargetTypeSetting struct {
	// NegativeGeoTargetType: The setting used for negative geotargeting in this
	// particular campaign.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - The value is unknown in this version.
	//   "PRESENCE_OR_INTEREST" - Specifies that a user is excluded from seeing the
	// ad if they are in, or show interest in, advertiser's excluded locations.
	//   "PRESENCE" - Specifies that a user is excluded from seeing the ad if they
	// are in advertiser's excluded locations.
	NegativeGeoTargetType string `json:"negativeGeoTargetType,omitempty"`
	// PositiveGeoTargetType: The setting used for positive geotargeting in this
	// particular campaign.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - The value is unknown in this version.
	//   "PRESENCE_OR_INTEREST" - Specifies that an ad is triggered if the user is
	// in, or shows interest in, advertiser's targeted locations.
	//   "SEARCH_INTEREST" - Specifies that an ad is triggered if the user searches
	// for advertiser's targeted locations. This can only be used with Search and
	// standard Shopping campaigns.
	//   "PRESENCE" - Specifies that an ad is triggered if the user is in or
	// regularly in advertiser's targeted locations.
	PositiveGeoTargetType string `json:"positiveGeoTargetType,omitempty"`
	// ForceSendFields is a list of field names (e.g. "NegativeGeoTargetType") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "NegativeGeoTargetType") to
	// include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesCampaignGeoTargetTypeSetting) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesCampaignGeoTargetTypeSetting
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesCampaignNetworkSettings: The network
// settings for the campaign.
type GoogleAdsSearchads360V0ResourcesCampaignNetworkSettings struct {
	// TargetContentNetwork: Whether ads will be served on specified placements in
	// the Google Display Network. Placements are specified using the Placement
	// criterion.
	TargetContentNetwork bool `json:"targetContentNetwork,omitempty"`
	// TargetGoogleSearch: Whether ads will be served with google.com search
	// results.
	TargetGoogleSearch bool `json:"targetGoogleSearch,omitempty"`
	// TargetPartnerSearchNetwork: Whether ads will be served on the Google Partner
	// Network. This is available only to some select Google partner accounts.
	TargetPartnerSearchNetwork bool `json:"targetPartnerSearchNetwork,omitempty"`
	// TargetSearchNetwork: Whether ads will be served on partner sites in the
	// Google Search Network (requires `target_google_search` to also be `true`).
	TargetSearchNetwork bool `json:"targetSearchNetwork,omitempty"`
	// ForceSendFields is a list of field names (e.g. "TargetContentNetwork") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "TargetContentNetwork") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesCampaignNetworkSettings) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesCampaignNetworkSettings
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesCampaignOptimizationGoalSetting:
// Optimization goal setting for this campaign, which includes a set of
// optimization goal types.
type GoogleAdsSearchads360V0ResourcesCampaignOptimizationGoalSetting struct {
	// OptimizationGoalTypes: The list of optimization goal types.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used as a return value only. Represents value unknown in this
	// version.
	//   "CALL_CLICKS" - Optimize for call clicks. Call click conversions are times
	// people selected 'Call' to contact a store after viewing an ad.
	//   "DRIVING_DIRECTIONS" - Optimize for driving directions. Driving directions
	// conversions are times people selected 'Get directions' to navigate to a
	// store after viewing an ad.
	//   "APP_PRE_REGISTRATION" - Optimize for pre-registration. Pre-registration
	// conversions are the number of pre-registration signups to receive a
	// notification when the app is released.
	OptimizationGoalTypes []string `json:"optimizationGoalTypes,omitempty"`
	// ForceSendFields is a list of field names (e.g. "OptimizationGoalTypes") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "OptimizationGoalTypes") to
	// include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesCampaignOptimizationGoalSetting) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesCampaignOptimizationGoalSetting
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesCampaignSelectiveOptimization: Selective
// optimization setting for this campaign, which includes a set of conversion
// actions to optimize this campaign towards. This feature only applies to app
// campaigns that use MULTI_CHANNEL as AdvertisingChannelType and APP_CAMPAIGN
// or APP_CAMPAIGN_FOR_ENGAGEMENT as AdvertisingChannelSubType.
type GoogleAdsSearchads360V0ResourcesCampaignSelectiveOptimization struct {
	// ConversionActions: The selected set of conversion actions for optimizing
	// this campaign.
	ConversionActions []string `json:"conversionActions,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ConversionActions") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ConversionActions") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesCampaignSelectiveOptimization) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesCampaignSelectiveOptimization
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesCampaignShoppingSetting: 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 GoogleAdsSearchads360V0ResourcesCampaignShoppingSetting struct {
	// CampaignPriority: 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 int64 `json:"campaignPriority,omitempty"`
	// EnableLocal: Whether to include local products.
	EnableLocal bool `json:"enableLocal,omitempty"`
	// FeedLabel: Feed label of products to include in the campaign. Only one of
	// feed_label or sales_country can be set. If used instead of sales_country,
	// the feed_label field accepts country codes in the same format for example:
	// 'XX'. Otherwise can be any string used for feed label in Google Merchant
	// Center.
	FeedLabel string `json:"feedLabel,omitempty"`
	// MerchantId: Immutable. ID of the Merchant Center account. This field is
	// required for create operations. This field is immutable for Shopping
	// campaigns.
	MerchantId int64 `json:"merchantId,omitempty,string"`
	// SalesCountry: Sales country of products to include in the campaign.
	SalesCountry string `json:"salesCountry,omitempty"`
	// UseVehicleInventory: Immutable. Whether to target Vehicle Listing inventory.
	UseVehicleInventory bool `json:"useVehicleInventory,omitempty"`
	// ForceSendFields is a list of field names (e.g. "CampaignPriority") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CampaignPriority") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesCampaignShoppingSetting) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesCampaignShoppingSetting
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesCampaignTrackingSetting: Campaign-level
// settings for tracking information.
type GoogleAdsSearchads360V0ResourcesCampaignTrackingSetting struct {
	// TrackingUrl: Output only. The url used for dynamic tracking.
	TrackingUrl string `json:"trackingUrl,omitempty"`
	// ForceSendFields is a list of field names (e.g. "TrackingUrl") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "TrackingUrl") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesCampaignTrackingSetting) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesCampaignTrackingSetting
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesConversionActionAttributionModelSettings:
// Settings related to this conversion action's attribution model.
type GoogleAdsSearchads360V0ResourcesConversionActionAttributionModelSettings struct {
	// AttributionModel: The attribution model type of this conversion action.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "EXTERNAL" - Uses external attribution.
	//   "GOOGLE_ADS_LAST_CLICK" - Attributes all credit for a conversion to its
	// last click.
	//   "GOOGLE_SEARCH_ATTRIBUTION_FIRST_CLICK" - Attributes all credit for a
	// conversion to its first click using Google Search attribution.
	//   "GOOGLE_SEARCH_ATTRIBUTION_LINEAR" - Attributes credit for a conversion
	// equally across all of its clicks using Google Search attribution.
	//   "GOOGLE_SEARCH_ATTRIBUTION_TIME_DECAY" - Attributes exponentially more
	// credit for a conversion to its more recent clicks using Google Search
	// attribution (half-life is 1 week).
	//   "GOOGLE_SEARCH_ATTRIBUTION_POSITION_BASED" - 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.
	//   "GOOGLE_SEARCH_ATTRIBUTION_DATA_DRIVEN" - Flexible model that uses machine
	// learning to determine the appropriate distribution of credit among clicks
	// using Google Search attribution.
	AttributionModel string `json:"attributionModel,omitempty"`
	// DataDrivenModelStatus: Output only. The status of the data-driven
	// attribution model for the conversion action.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "AVAILABLE" - The data driven model is available.
	//   "STALE" - 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.
	//   "EXPIRED" - 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.
	//   "NEVER_GENERATED" - 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.
	DataDrivenModelStatus string `json:"dataDrivenModelStatus,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AttributionModel") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AttributionModel") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesConversionActionAttributionModelSettings) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesConversionActionAttributionModelSettings
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesConversionActionFloodlightSettings: Settings
// related to a Floodlight conversion action.
type GoogleAdsSearchads360V0ResourcesConversionActionFloodlightSettings struct {
	// ActivityGroupTag: Output only. String used to identify a Floodlight activity
	// group when reporting conversions.
	ActivityGroupTag string `json:"activityGroupTag,omitempty"`
	// ActivityId: Output only. ID of the Floodlight activity in DoubleClick
	// Campaign Manager (DCM).
	ActivityId int64 `json:"activityId,omitempty,string"`
	// ActivityTag: Output only. String used to identify a Floodlight activity when
	// reporting conversions.
	ActivityTag string `json:"activityTag,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ActivityGroupTag") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ActivityGroupTag") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesConversionActionFloodlightSettings) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesConversionActionFloodlightSettings
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesConversionActionValueSettings: Settings
// related to the value for conversion events associated with this conversion
// action.
type GoogleAdsSearchads360V0ResourcesConversionActionValueSettings struct {
	// AlwaysUseDefaultValue: 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 bool `json:"alwaysUseDefaultValue,omitempty"`
	// DefaultCurrencyCode: 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 string `json:"defaultCurrencyCode,omitempty"`
	// DefaultValue: 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 float64 `json:"defaultValue,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AlwaysUseDefaultValue") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AlwaysUseDefaultValue") to
	// include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesConversionActionValueSettings) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesConversionActionValueSettings
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

func (s *GoogleAdsSearchads360V0ResourcesConversionActionValueSettings) UnmarshalJSON(data []byte) error {
	type NoMethod GoogleAdsSearchads360V0ResourcesConversionActionValueSettings
	var s1 struct {
		DefaultValue gensupport.JSONFloat64 `json:"defaultValue"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.DefaultValue = float64(s1.DefaultValue)
	return nil
}

// GoogleAdsSearchads360V0ResourcesConversionCustomVariableFloodlightConversionC
// ustomVariableInfo: Information for Search Ads 360 Floodlight Conversion
// Custom Variables.
type GoogleAdsSearchads360V0ResourcesConversionCustomVariableFloodlightConversionCustomVariableInfo struct {
	// FloodlightVariableDataType: Output only. Floodlight variable data type
	// defined in Search Ads 360.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "NUMBER" - Represents a floodlight variable of "Number" type. This
	// variable may be assigned to floodlight variables of DIMENSION or METRIC
	// types.
	//   "STRING" - Represents a floodlight variable of "String" type. This
	// variable may be assigned to floodlight variables of DIMENSION type.
	FloodlightVariableDataType string `json:"floodlightVariableDataType,omitempty"`
	// FloodlightVariableType: Output only. Floodlight variable type defined in
	// Search Ads 360.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "DIMENSION" - Dimension floodlight variable type.
	//   "METRIC" - Metric floodlight variable type.
	//   "UNSET" - Floodlight variable type is unset.
	FloodlightVariableType string `json:"floodlightVariableType,omitempty"`
	// ForceSendFields is a list of field names (e.g. "FloodlightVariableDataType")
	// to unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "FloodlightVariableDataType") to
	// include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesConversionCustomVariableFloodlightConversionCustomVariableInfo) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesConversionCustomVariableFloodlightConversionCustomVariableInfo
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductBiddingCate
// gory: One element of a bidding category at a certain level. Top-level
// categories are at level 1, their children at level 2, and so on. We
// currently support up to 5 levels. The user must specify a dimension type
// that indicates the level of the category. All cases of the same subdivision
// must have the same dimension type (category level).
type GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductBiddingCategory struct {
	// Id: 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 int64 `json:"id,omitempty,string"`
	// Level: Indicates the level of the category in the taxonomy.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "LEVEL1" - Level 1.
	//   "LEVEL2" - Level 2.
	//   "LEVEL3" - Level 3.
	//   "LEVEL4" - Level 4.
	//   "LEVEL5" - Level 5.
	Level string `json:"level,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Id") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Id") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductBiddingCategory) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductBiddingCategory
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductBrand:
// Brand of the product.
type GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductBrand struct {
	// Value: String value of the product brand.
	Value string `json:"value,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Value") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Value") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductBrand) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductBrand
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductChannel:
// Locality of a product offer.
type GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductChannel struct {
	// Channel: Value of the locality.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ONLINE" - The item is sold online.
	//   "LOCAL" - The item is sold in local stores.
	Channel string `json:"channel,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Channel") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Channel") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductChannel) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductChannel
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductCondition:
// Condition of a product offer.
type GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductCondition struct {
	// Condition: Value of the condition.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "NEW" - The product condition is new.
	//   "REFURBISHED" - The product condition is refurbished.
	//   "USED" - The product condition is used.
	Condition string `json:"condition,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Condition") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Condition") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductCondition) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductCondition
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductCustomAttri
// bute: Custom attribute of a product offer.
type GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductCustomAttribute struct {
	// Index: Indicates the index of the custom attribute.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "INDEX0" - First listing group filter custom attribute.
	//   "INDEX1" - Second listing group filter custom attribute.
	//   "INDEX2" - Third listing group filter custom attribute.
	//   "INDEX3" - Fourth listing group filter custom attribute.
	//   "INDEX4" - Fifth listing group filter custom attribute.
	Index string `json:"index,omitempty"`
	// Value: String value of the product custom attribute.
	Value string `json:"value,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Index") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Index") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductCustomAttribute) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductCustomAttribute
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductItemId:
// Item id of a product offer.
type GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductItemId struct {
	// Value: Value of the id.
	Value string `json:"value,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Value") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Value") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductItemId) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductItemId
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductType: Type
// of a product offer.
type GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductType struct {
	// Level: Level of the type.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "LEVEL1" - Level 1.
	//   "LEVEL2" - Level 2.
	//   "LEVEL3" - Level 3.
	//   "LEVEL4" - Level 4.
	//   "LEVEL5" - Level 5.
	Level string `json:"level,omitempty"`
	// Value: Value of the type.
	Value string `json:"value,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Level") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Level") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductType) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductType
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AccessibleBiddingStrategy: Represents a
// view of BiddingStrategies owned by and shared with the customer. In contrast
// to BiddingStrategy, this resource includes strategies owned by managers of
// the customer and shared with this customer - in addition to strategies owned
// by this customer. This resource does not provide metrics and only exposes a
// limited subset of the BiddingStrategy attributes.
type GoogleAdsSearchads360V0Resources__AccessibleBiddingStrategy struct {
	// Id: Output only. The ID of the bidding strategy.
	Id int64 `json:"id,omitempty,string"`
	// MaximizeConversionValue: Output only. An automated bidding strategy to help
	// get the most conversion value for your campaigns while spending your budget.
	MaximizeConversionValue *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversionValue `json:"maximizeConversionValue,omitempty"`
	// MaximizeConversions: Output only. An automated bidding strategy to help get
	// the most conversions for your campaigns while spending your budget.
	MaximizeConversions *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyMaximizeConversions `json:"maximizeConversions,omitempty"`
	// Name: Output only. The name of the bidding strategy.
	Name string `json:"name,omitempty"`
	// OwnerCustomerId: Output only. The ID of the Customer which owns the bidding
	// strategy.
	OwnerCustomerId int64 `json:"ownerCustomerId,omitempty,string"`
	// OwnerDescriptiveName: Output only. descriptive_name of the Customer which
	// owns the bidding strategy.
	OwnerDescriptiveName string `json:"ownerDescriptiveName,omitempty"`
	// ResourceName: Output only. The resource name of the accessible bidding
	// strategy. AccessibleBiddingStrategy resource names have the form:
	// `customers/{customer_id}/accessibleBiddingStrategies/{bidding_strategy_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// TargetCpa: Output only. A bidding strategy that sets bids to help get as
	// many conversions as possible at the target cost-per-acquisition (CPA) you
	// set.
	TargetCpa *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetCpa `json:"targetCpa,omitempty"`
	// TargetImpressionShare: Output only. A bidding strategy that automatically
	// optimizes towards a chosen percentage of impressions.
	TargetImpressionShare *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetImpressionShare `json:"targetImpressionShare,omitempty"`
	// TargetRoas: Output only. A bidding strategy that helps you maximize revenue
	// while averaging a specific target Return On Ad Spend (ROAS).
	TargetRoas *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetRoas `json:"targetRoas,omitempty"`
	// TargetSpend: Output only. A bid strategy that sets your bids to help get as
	// many clicks as possible within your budget.
	TargetSpend *GoogleAdsSearchads360V0ResourcesAccessibleBiddingStrategyTargetSpend `json:"targetSpend,omitempty"`
	// Type: Output only. The type of the bidding strategy.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "COMMISSION" - Commission is an automatic bidding strategy in which the
	// advertiser pays a certain portion of the conversion value.
	//   "ENHANCED_CPC" - 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.
	//   "INVALID" - Used for return value only. Indicates that a campaign does not
	// have a bidding strategy. This prevents the campaign from serving. For
	// example, a campaign may be attached to a manager bidding strategy and the
	// serving account is subsequently unlinked from the manager account. In this
	// case the campaign will automatically be detached from the now inaccessible
	// manager bidding strategy and transition to the INVALID bidding strategy
	// type.
	//   "MANUAL_CPA" - Manual bidding strategy that allows advertiser to set the
	// bid per advertiser-specified action.
	//   "MANUAL_CPC" - Manual click based bidding where user pays per click.
	//   "MANUAL_CPM" - Manual impression based bidding where user pays per
	// thousand impressions.
	//   "MANUAL_CPV" - A bidding strategy that pays a configurable amount per
	// video view.
	//   "MAXIMIZE_CONVERSIONS" - A bidding strategy that automatically maximizes
	// number of conversions given a daily budget.
	//   "MAXIMIZE_CONVERSION_VALUE" - An automated bidding strategy that
	// automatically sets bids to maximize revenue while spending your budget.
	//   "PAGE_ONE_PROMOTED" - 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.
	//   "PERCENT_CPC" - Percent Cpc is bidding strategy where bids are a fraction
	// of the advertised price for some good or service.
	//   "TARGET_CPA" - 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.
	//   "TARGET_CPM" - 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.
	//   "TARGET_IMPRESSION_SHARE" - 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).
	//   "TARGET_OUTRANK_SHARE" - 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.
	//   "TARGET_ROAS" - Target ROAS is an automated bidding strategy that helps
	// you maximize revenue while averaging a specific target Return On Average
	// Spend (ROAS).
	//   "TARGET_SPEND" - Target Spend is an automated bid strategy that sets your
	// bids to help get as many clicks as possible within your budget.
	Type string `json:"type,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Id") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Id") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AccessibleBiddingStrategy) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AccessibleBiddingStrategy
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__Ad: An ad.
type GoogleAdsSearchads360V0Resources__Ad struct {
	// DisplayUrl: The URL that appears in the ad description for some ad formats.
	DisplayUrl string `json:"displayUrl,omitempty"`
	// ExpandedDynamicSearchAd: Immutable. Details pertaining to an expanded
	// dynamic search ad.
	ExpandedDynamicSearchAd *GoogleAdsSearchads360V0Common__SearchAds360ExpandedDynamicSearchAdInfo `json:"expandedDynamicSearchAd,omitempty"`
	// ExpandedTextAd: Immutable. Details pertaining to an expanded text ad.
	ExpandedTextAd *GoogleAdsSearchads360V0Common__SearchAds360ExpandedTextAdInfo `json:"expandedTextAd,omitempty"`
	// FinalUrls: The list of possible final URLs after all cross-domain redirects
	// for the ad.
	FinalUrls []string `json:"finalUrls,omitempty"`
	// Id: Output only. The ID of the ad.
	Id int64 `json:"id,omitempty,string"`
	// Name: Immutable. 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. The name field is currently only supported for DisplayUploadAd,
	// ImageAd, ShoppingComparisonListingAd and VideoAd.
	Name string `json:"name,omitempty"`
	// ProductAd: Immutable. Details pertaining to a product ad.
	ProductAd *GoogleAdsSearchads360V0Common__SearchAds360ProductAdInfo `json:"productAd,omitempty"`
	// ResourceName: Immutable. The resource name of the ad. Ad resource names have
	// the form: `customers/{customer_id}/ads/{ad_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// ResponsiveSearchAd: Immutable. Details pertaining to a responsive search ad.
	ResponsiveSearchAd *GoogleAdsSearchads360V0Common__SearchAds360ResponsiveSearchAdInfo `json:"responsiveSearchAd,omitempty"`
	// TextAd: Immutable. Details pertaining to a text ad.
	TextAd *GoogleAdsSearchads360V0Common__SearchAds360TextAdInfo `json:"textAd,omitempty"`
	// Type: Output only. The type of ad.
	//
	// Possible values:
	//   "UNSPECIFIED" - No value has been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "TEXT_AD" - The ad is a text ad.
	//   "EXPANDED_TEXT_AD" - The ad is an expanded text ad.
	//   "CALL_ONLY_AD" - The ad is a call only ad.
	//   "EXPANDED_DYNAMIC_SEARCH_AD" - The ad is an expanded dynamic search ad.
	//   "HOTEL_AD" - The ad is a hotel ad.
	//   "SHOPPING_SMART_AD" - The ad is a Smart Shopping ad.
	//   "SHOPPING_PRODUCT_AD" - The ad is a standard Shopping ad.
	//   "VIDEO_AD" - The ad is a video ad.
	//   "GMAIL_AD" - This ad is a Gmail ad.
	//   "IMAGE_AD" - This ad is an Image ad.
	//   "RESPONSIVE_SEARCH_AD" - The ad is a responsive search ad.
	//   "LEGACY_RESPONSIVE_DISPLAY_AD" - The ad is a legacy responsive display ad.
	//   "APP_AD" - The ad is an app ad.
	//   "LEGACY_APP_INSTALL_AD" - The ad is a legacy app install ad.
	//   "RESPONSIVE_DISPLAY_AD" - The ad is a responsive display ad.
	//   "LOCAL_AD" - The ad is a local ad.
	//   "HTML5_UPLOAD_AD" - The ad is a display upload ad with the HTML5_UPLOAD_AD
	// product type.
	//   "DYNAMIC_HTML5_AD" - The ad is a display upload ad with one of the
	// DYNAMIC_HTML5_* product types.
	//   "APP_ENGAGEMENT_AD" - The ad is an app engagement ad.
	//   "SHOPPING_COMPARISON_LISTING_AD" - The ad is a Shopping Comparison Listing
	// ad.
	//   "VIDEO_BUMPER_AD" - Video bumper ad.
	//   "VIDEO_NON_SKIPPABLE_IN_STREAM_AD" - Video non-skippable in-stream ad.
	//   "VIDEO_OUTSTREAM_AD" - Video outstream ad.
	//   "VIDEO_TRUEVIEW_DISCOVERY_AD" - Video TrueView in-display ad.
	//   "VIDEO_TRUEVIEW_IN_STREAM_AD" - Video TrueView in-stream ad.
	//   "VIDEO_RESPONSIVE_AD" - Video responsive ad.
	//   "SMART_CAMPAIGN_AD" - Smart campaign ad.
	//   "APP_PRE_REGISTRATION_AD" - Universal app pre-registration ad.
	//   "DISCOVERY_MULTI_ASSET_AD" - Discovery multi asset ad.
	//   "DISCOVERY_CAROUSEL_AD" - Discovery carousel ad.
	//   "TRAVEL_AD" - Travel ad.
	//   "DISCOVERY_VIDEO_RESPONSIVE_AD" - Discovery video responsive ad.
	Type string `json:"type,omitempty"`
	// ForceSendFields is a list of field names (e.g. "DisplayUrl") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "DisplayUrl") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__Ad) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__Ad
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AdGroup: An ad group.
type GoogleAdsSearchads360V0Resources__AdGroup struct {
	// AdRotationMode: The ad rotation mode of the ad group.
	//
	// Possible values:
	//   "UNSPECIFIED" - The ad rotation mode has not been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "OPTIMIZE" - Optimize ad group ads based on clicks or conversions.
	//   "ROTATE_FOREVER" - Rotate evenly forever.
	AdRotationMode string `json:"adRotationMode,omitempty"`
	// CpcBidMicros: The maximum CPC (cost-per-click) bid.
	CpcBidMicros int64 `json:"cpcBidMicros,omitempty,string"`
	// CreationTime: Output only. The timestamp when this ad_group was created. The
	// timestamp is in the customer's time zone and in "yyyy-MM-dd HH:mm:ss"
	// format.
	CreationTime string `json:"creationTime,omitempty"`
	// EndDate: Output only. Date when the ad group ends serving ads. By default,
	// the ad group ends on the ad group's end date. If this field is set, then the
	// ad group ends at the end of the specified date in the customer's time zone.
	// This field is only available for Microsoft Advertising and Facebook gateway
	// accounts. Format: YYYY-MM-DD Example: 2019-03-14
	EndDate string `json:"endDate,omitempty"`
	// EngineId: Output only. ID of the ad group in the external engine account.
	// This field is for non-Google Ads account only, for example, Yahoo Japan,
	// Microsoft, Baidu etc. For Google Ads entity, use "ad_group.id" instead.
	EngineId string `json:"engineId,omitempty"`
	// EngineStatus: Output only. The Engine Status for ad group.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "AD_GROUP_ELIGIBLE" - Deprecated. Do not use.
	//   "AD_GROUP_EXPIRED" - No ads are running for this ad group, because the ad
	// group's end date has passed.
	//   "AD_GROUP_REMOVED" - The ad group has been deleted.
	//   "AD_GROUP_DRAFT" - No ads are running for this ad group because the
	// associated ad group is still in draft form.
	//   "AD_GROUP_PAUSED" - The ad group has been paused.
	//   "AD_GROUP_SERVING" - The ad group is active and currently serving ads.
	//   "AD_GROUP_SUBMITTED" - The ad group has been submitted (Microsoft Bing Ads
	// legacy status).
	//   "CAMPAIGN_PAUSED" - No ads are running for this ad group, because the
	// campaign has been paused.
	//   "ACCOUNT_PAUSED" - No ads are running for this ad group, because the
	// account has been paused.
	EngineStatus string `json:"engineStatus,omitempty"`
	// Id: Output only. The ID of the ad group.
	Id int64 `json:"id,omitempty,string"`
	// Labels: Output only. The resource names of labels attached to this ad group.
	Labels []string `json:"labels,omitempty"`
	// LanguageCode: Output only. The language of the ads and keywords in an ad
	// group. This field is only available for Microsoft Advertising accounts. More
	// details:
	// https://docs.microsoft.com/en-us/advertising/guides/ad-languages?view=bingads-13#adlanguage
	LanguageCode string `json:"languageCode,omitempty"`
	// LastModifiedTime: Output only. The datetime when this ad group was last
	// modified. The datetime is in the customer's time zone and in "yyyy-MM-dd
	// HH:mm:ss.ssssss" format.
	LastModifiedTime string `json:"lastModifiedTime,omitempty"`
	// Name: 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 string `json:"name,omitempty"`
	// ResourceName: Immutable. The resource name of the ad group. Ad group
	// resource names have the form:
	// `customers/{customer_id}/adGroups/{ad_group_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// StartDate: Output only. Date when this ad group starts serving ads. By
	// default, the ad group starts now or the ad group's start date, whichever is
	// later. If this field is set, then the ad group starts at the beginning of
	// the specified date in the customer's time zone. This field is only available
	// for Microsoft Advertising and Facebook gateway accounts. Format: YYYY-MM-DD
	// Example: 2019-03-14
	StartDate string `json:"startDate,omitempty"`
	// Status: The status of the ad group.
	//
	// Possible values:
	//   "UNSPECIFIED" - The status has not been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "ENABLED" - The ad group is enabled.
	//   "PAUSED" - The ad group is paused.
	//   "REMOVED" - The ad group is removed.
	Status string `json:"status,omitempty"`
	// TargetingSetting: Setting for targeting related features.
	TargetingSetting *GoogleAdsSearchads360V0Common__TargetingSetting `json:"targetingSetting,omitempty"`
	// Type: Immutable. The type of the ad group.
	//
	// Possible values:
	//   "UNSPECIFIED" - The type has not been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "SEARCH_STANDARD" - The default ad group type for Search campaigns.
	//   "DISPLAY_STANDARD" - The default ad group type for Display campaigns.
	//   "SHOPPING_PRODUCT_ADS" - The ad group type for Shopping campaigns serving
	// standard product ads.
	//   "SHOPPING_SHOWCASE_ADS" - The type for ad groups that are limited to
	// serving Showcase or Merchant ads in Shopping results.
	//   "HOTEL_ADS" - The default ad group type for Hotel campaigns.
	//   "SHOPPING_SMART_ADS" - The type for ad groups in Smart Shopping campaigns.
	//   "VIDEO_BUMPER" - Short unskippable in-stream video ads.
	//   "VIDEO_TRUE_VIEW_IN_STREAM" - TrueView (skippable) in-stream video ads.
	//   "VIDEO_TRUE_VIEW_IN_DISPLAY" - TrueView in-display video ads.
	//   "VIDEO_NON_SKIPPABLE_IN_STREAM" - Unskippable in-stream video ads.
	//   "VIDEO_OUTSTREAM" - Outstream video ads.
	//   "SEARCH_DYNAMIC_ADS" - Ad group type for Dynamic Search Ads ad groups.
	//   "SHOPPING_COMPARISON_LISTING_ADS" - The type for ad groups in Shopping
	// Comparison Listing campaigns.
	//   "PROMOTED_HOTEL_ADS" - The ad group type for Promoted Hotel ad groups.
	//   "VIDEO_RESPONSIVE" - Video responsive ad groups.
	//   "VIDEO_EFFICIENT_REACH" - Video efficient reach ad groups.
	//   "SMART_CAMPAIGN_ADS" - Ad group type for Smart campaigns.
	//   "TRAVEL_ADS" - Ad group type for Travel campaigns.
	Type string `json:"type,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdRotationMode") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdRotationMode") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AdGroup) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroup
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AdGroupAd: An ad group ad.
type GoogleAdsSearchads360V0Resources__AdGroupAd struct {
	// Ad: Immutable. The ad.
	Ad *GoogleAdsSearchads360V0Resources__Ad `json:"ad,omitempty"`
	// CreationTime: Output only. The timestamp when this ad_group_ad was created.
	// The datetime is in the customer's time zone and in "yyyy-MM-dd
	// HH:mm:ss.ssssss" format.
	CreationTime string `json:"creationTime,omitempty"`
	// EngineId: Output only. ID of the ad in the external engine account. This
	// field is for SearchAds 360 account only, for example, Yahoo Japan,
	// Microsoft, Baidu etc. For non-SearchAds 360 entity, use "ad_group_ad.ad.id"
	// instead.
	EngineId string `json:"engineId,omitempty"`
	// EngineStatus: Output only. Additional status of the ad in the external
	// engine account. Possible statuses (depending on the type of external
	// account) include active, eligible, pending review, etc.
	//
	// Possible values:
	//   "UNSPECIFIED" - No value has been specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "AD_GROUP_AD_ELIGIBLE" - Deprecated. Do not use.
	//   "AD_GROUP_AD_INAPPROPRIATE_FOR_CAMPAIGN" - Baidu: Creative was not
	// approved.
	//   "AD_GROUP_AD_MOBILE_URL_UNDER_REVIEW" - Baidu: Mobile URL in process to be
	// reviewed.
	//   "AD_GROUP_AD_PARTIALLY_INVALID" - Baidu: Creative is invalid on mobile
	// device but valid on desktop.
	//   "AD_GROUP_AD_TO_BE_ACTIVATED" - Baidu: Creative is ready for activation.
	//   "AD_GROUP_AD_NOT_REVIEWED" - Baidu: Creative not reviewed.
	//   "AD_GROUP_AD_ON_HOLD" - Deprecated. Do not use. Previously used by Gemini
	//   "AD_GROUP_AD_PAUSED" - Creative has been paused.
	//   "AD_GROUP_AD_REMOVED" - Creative has been removed.
	//   "AD_GROUP_AD_PENDING_REVIEW" - Creative is pending review.
	//   "AD_GROUP_AD_UNDER_REVIEW" - Creative is under review.
	//   "AD_GROUP_AD_APPROVED" - Creative has been approved.
	//   "AD_GROUP_AD_DISAPPROVED" - Creative has been disapproved.
	//   "AD_GROUP_AD_SERVING" - Creative is serving.
	//   "AD_GROUP_AD_ACCOUNT_PAUSED" - Creative has been paused because the
	// account is paused.
	//   "AD_GROUP_AD_CAMPAIGN_PAUSED" - Creative has been paused because the
	// campaign is paused.
	//   "AD_GROUP_AD_AD_GROUP_PAUSED" - Creative has been paused because the ad
	// group is paused.
	EngineStatus string `json:"engineStatus,omitempty"`
	// Labels: Output only. The resource names of labels attached to this ad group
	// ad.
	Labels []string `json:"labels,omitempty"`
	// LastModifiedTime: Output only. The datetime when this ad group ad was last
	// modified. The datetime is in the customer's time zone and in "yyyy-MM-dd
	// HH:mm:ss.ssssss" format.
	LastModifiedTime string `json:"lastModifiedTime,omitempty"`
	// ResourceName: Immutable. 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 `json:"resourceName,omitempty"`
	// Status: The status of the ad.
	//
	// Possible values:
	//   "UNSPECIFIED" - No value has been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "ENABLED" - The ad group ad is enabled.
	//   "PAUSED" - The ad group ad is paused.
	//   "REMOVED" - The ad group ad is removed.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Ad") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Ad") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AdGroupAd) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroupAd
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AdGroupAdLabel: A relationship between an
// ad group ad and a label.
type GoogleAdsSearchads360V0Resources__AdGroupAdLabel struct {
	// AdGroupAd: Immutable. The ad group ad to which the label is attached.
	AdGroupAd string `json:"adGroupAd,omitempty"`
	// Label: Immutable. The label assigned to the ad group ad.
	Label string `json:"label,omitempty"`
	// ResourceName: Immutable. 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 `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdGroupAd") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdGroupAd") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AdGroupAdLabel) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroupAdLabel
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AdGroupAsset: A link between an ad group
// and an asset.
type GoogleAdsSearchads360V0Resources__AdGroupAsset struct {
	// AdGroup: Required. Immutable. The ad group to which the asset is linked.
	AdGroup string `json:"adGroup,omitempty"`
	// Asset: Required. Immutable. The asset which is linked to the ad group.
	Asset string `json:"asset,omitempty"`
	// ResourceName: Immutable. The resource name of the ad group asset.
	// AdGroupAsset resource names have the form:
	// `customers/{customer_id}/adGroupAssets/{ad_group_id}~{asset_id}~{field_type}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Status of the ad group asset.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ENABLED" - Asset link is enabled.
	//   "REMOVED" - Asset link has been removed.
	//   "PAUSED" - Asset link is paused.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdGroup") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdGroup") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AdGroupAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroupAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AdGroupAssetSet: AdGroupAssetSet is the
// linkage between an ad group and an asset set. Creating an AdGroupAssetSet
// links an asset set with an ad group.
type GoogleAdsSearchads360V0Resources__AdGroupAssetSet struct {
	// AdGroup: Immutable. The ad group to which this asset set is linked.
	AdGroup string `json:"adGroup,omitempty"`
	// AssetSet: Immutable. The asset set which is linked to the ad group.
	AssetSet string `json:"assetSet,omitempty"`
	// ResourceName: Immutable. The resource name of the ad group asset set. Ad
	// group asset set resource names have the form:
	// `customers/{customer_id}/adGroupAssetSets/{ad_group_id}~{asset_set_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. The status of the ad group asset set. Read-only.
	//
	// Possible values:
	//   "UNSPECIFIED" - The status has not been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "ENABLED" - The linkage between asset set and its container is enabled.
	//   "REMOVED" - The linkage between asset set and its container is removed.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdGroup") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdGroup") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AdGroupAssetSet) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroupAssetSet
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AdGroupAudienceView: 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 GoogleAdsSearchads360V0Resources__AdGroupAudienceView struct {
	// ResourceName: Output only. 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 `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ResourceName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ResourceName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AdGroupAudienceView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroupAudienceView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AdGroupBidModifier: Represents an ad group
// bid modifier.
type GoogleAdsSearchads360V0Resources__AdGroupBidModifier struct {
	// BidModifier: 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 float64 `json:"bidModifier,omitempty"`
	// Device: Immutable. A device criterion.
	Device *GoogleAdsSearchads360V0Common__DeviceInfo `json:"device,omitempty"`
	// ResourceName: Immutable. 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 `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "BidModifier") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "BidModifier") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AdGroupBidModifier) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroupBidModifier
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

func (s *GoogleAdsSearchads360V0Resources__AdGroupBidModifier) UnmarshalJSON(data []byte) error {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroupBidModifier
	var s1 struct {
		BidModifier gensupport.JSONFloat64 `json:"bidModifier"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.BidModifier = float64(s1.BidModifier)
	return nil
}

// GoogleAdsSearchads360V0Resources__AdGroupCriterion: An ad group criterion.
// The ad_group_criterion report only returns criteria that were explicitly
// added to the ad group.
type GoogleAdsSearchads360V0Resources__AdGroupCriterion struct {
	// AdGroup: Immutable. The ad group to which the criterion belongs.
	AdGroup string `json:"adGroup,omitempty"`
	// AgeRange: Immutable. Age range.
	AgeRange *GoogleAdsSearchads360V0Common__AgeRangeInfo `json:"ageRange,omitempty"`
	// BidModifier: 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 float64 `json:"bidModifier,omitempty"`
	// CpcBidMicros: The CPC (cost-per-click) bid.
	CpcBidMicros int64 `json:"cpcBidMicros,omitempty,string"`
	// CreationTime: Output only. The timestamp when this ad group criterion was
	// created. The timestamp is in the customer's time zone and in "yyyy-MM-dd
	// HH:mm:ss" format.
	CreationTime string `json:"creationTime,omitempty"`
	// CriterionId: Output only. The ID of the criterion.
	CriterionId int64 `json:"criterionId,omitempty,string"`
	// EffectiveCpcBidMicros: Output only. The effective CPC (cost-per-click) bid.
	EffectiveCpcBidMicros int64 `json:"effectiveCpcBidMicros,omitempty,string"`
	// EngineId: Output only. ID of the ad group criterion in the external engine
	// account. This field is for non-Google Ads account only, for example, Yahoo
	// Japan, Microsoft, Baidu etc. For Google Ads entity, use
	// "ad_group_criterion.criterion_id" instead.
	EngineId string `json:"engineId,omitempty"`
	// EngineStatus: Output only. The Engine Status for ad group criterion.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "AD_GROUP_CRITERION_ELIGIBLE" - Deprecated. Do not use.
	//   "AD_GROUP_CRITERION_INAPPROPRIATE_FOR_CAMPAIGN" - Baidu: Bid or quality
	// too low to be displayed.
	//   "AD_GROUP_CRITERION_INVALID_MOBILE_SEARCH" - Baidu: Bid or quality too low
	// for mobile, but eligible to display for desktop.
	//   "AD_GROUP_CRITERION_INVALID_PC_SEARCH" - Baidu: Bid or quality too low for
	// desktop, but eligible to display for mobile.
	//   "AD_GROUP_CRITERION_INVALID_SEARCH" - Baidu: Bid or quality too low to be
	// displayed.
	//   "AD_GROUP_CRITERION_LOW_SEARCH_VOLUME" - Baidu: Paused by Baidu due to low
	// search volume.
	//   "AD_GROUP_CRITERION_MOBILE_URL_UNDER_REVIEW" - Baidu: Mobile URL in
	// process to be reviewed.
	//   "AD_GROUP_CRITERION_PARTIALLY_INVALID" - Baidu: The landing page for one
	// device is invalid, while the landing page for the other device is valid.
	//   "AD_GROUP_CRITERION_TO_BE_ACTIVATED" - Baidu: Keyword has been created and
	// paused by Baidu account management, and is now ready for you to activate it.
	//   "AD_GROUP_CRITERION_UNDER_REVIEW" - Baidu: In process to be reviewed by
	// Baidu. Gemini: Criterion under review.
	//   "AD_GROUP_CRITERION_NOT_REVIEWED" - Baidu: Criterion to be reviewed.
	//   "AD_GROUP_CRITERION_ON_HOLD" - Deprecated. Do not use. Previously used by
	// Gemini
	//   "AD_GROUP_CRITERION_PENDING_REVIEW" - Y!J : Criterion pending review
	//   "AD_GROUP_CRITERION_PAUSED" - Criterion has been paused.
	//   "AD_GROUP_CRITERION_REMOVED" - Criterion has been removed.
	//   "AD_GROUP_CRITERION_APPROVED" - Criterion has been approved.
	//   "AD_GROUP_CRITERION_DISAPPROVED" - Criterion has been disapproved.
	//   "AD_GROUP_CRITERION_SERVING" - Criterion is active and serving.
	//   "AD_GROUP_CRITERION_ACCOUNT_PAUSED" - Criterion has been paused since the
	// account is paused.
	EngineStatus string `json:"engineStatus,omitempty"`
	// FinalUrlSuffix: URL template for appending params to final URL.
	FinalUrlSuffix string `json:"finalUrlSuffix,omitempty"`
	// FinalUrls: The list of possible final URLs after all cross-domain redirects
	// for the ad.
	FinalUrls []string `json:"finalUrls,omitempty"`
	// Gender: Immutable. Gender.
	Gender *GoogleAdsSearchads360V0Common__GenderInfo `json:"gender,omitempty"`
	// Keyword: Immutable. Keyword.
	Keyword *GoogleAdsSearchads360V0Common__KeywordInfo `json:"keyword,omitempty"`
	// Labels: Output only. The resource names of labels attached to this ad group
	// criterion.
	Labels []string `json:"labels,omitempty"`
	// LastModifiedTime: Output only. The datetime when this ad group criterion was
	// last modified. The datetime is in the customer's time zone and in
	// "yyyy-MM-dd HH:mm:ss.ssssss" format.
	LastModifiedTime string `json:"lastModifiedTime,omitempty"`
	// ListingGroup: Immutable. Listing group.
	ListingGroup *GoogleAdsSearchads360V0Common__ListingGroupInfo `json:"listingGroup,omitempty"`
	// Location: Immutable. Location.
	Location *GoogleAdsSearchads360V0Common__LocationInfo `json:"location,omitempty"`
	// Negative: Immutable. 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 bool `json:"negative,omitempty"`
	// PositionEstimates: Output only. Estimates for criterion bids at various
	// positions.
	PositionEstimates *GoogleAdsSearchads360V0ResourcesAdGroupCriterionPositionEstimates `json:"positionEstimates,omitempty"`
	// QualityInfo: Output only. Information regarding the quality of the
	// criterion.
	QualityInfo *GoogleAdsSearchads360V0ResourcesAdGroupCriterionQualityInfo `json:"qualityInfo,omitempty"`
	// ResourceName: Immutable. 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 `json:"resourceName,omitempty"`
	// Status: The status of the criterion. This is the status of the ad group
	// criterion entity, set by the client. Note: UI reports may incorporate
	// additional information that affects whether a criterion is eligible to run.
	// In some cases a criterion that's REMOVED in the API can still show as
	// enabled in the UI. For example, campaigns by default show to users of all
	// age ranges unless excluded. The UI will show each age range as "enabled",
	// since they're eligible to see the ads; but AdGroupCriterion.status will show
	// "removed", since no positive criterion was added.
	//
	// Possible values:
	//   "UNSPECIFIED" - No value has been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "ENABLED" - The ad group criterion is enabled.
	//   "PAUSED" - The ad group criterion is paused.
	//   "REMOVED" - The ad group criterion is removed.
	Status string `json:"status,omitempty"`
	// TrackingUrlTemplate: The URL template for constructing a tracking URL.
	TrackingUrlTemplate string `json:"trackingUrlTemplate,omitempty"`
	// Type: Output only. The type of the criterion.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "KEYWORD" - Keyword, for example, 'mars cruise'.
	//   "PLACEMENT" - Placement, also known as Website, for example,
	// 'www.flowers4sale.com'
	//   "MOBILE_APP_CATEGORY" - Mobile application categories to target.
	//   "MOBILE_APPLICATION" - Mobile applications to target.
	//   "DEVICE" - Devices to target.
	//   "LOCATION" - Locations to target.
	//   "LISTING_GROUP" - Listing groups to target.
	//   "AD_SCHEDULE" - Ad Schedule.
	//   "AGE_RANGE" - Age range.
	//   "GENDER" - Gender.
	//   "INCOME_RANGE" - Income Range.
	//   "PARENTAL_STATUS" - Parental status.
	//   "YOUTUBE_VIDEO" - YouTube Video.
	//   "YOUTUBE_CHANNEL" - YouTube Channel.
	//   "USER_LIST" - User list.
	//   "PROXIMITY" - Proximity.
	//   "TOPIC" - A topic target on the display network (for example, "Pets &
	// Animals").
	//   "LISTING_SCOPE" - Listing scope to target.
	//   "LANGUAGE" - Language.
	//   "IP_BLOCK" - IpBlock.
	//   "CONTENT_LABEL" - Content Label for category exclusion.
	//   "CARRIER" - Carrier.
	//   "USER_INTEREST" - A category the user is interested in.
	//   "WEBPAGE" - Webpage criterion for dynamic search ads.
	//   "OPERATING_SYSTEM_VERSION" - Operating system version.
	//   "APP_PAYMENT_MODEL" - App payment model.
	//   "MOBILE_DEVICE" - Mobile device.
	//   "CUSTOM_AFFINITY" - Custom affinity.
	//   "CUSTOM_INTENT" - Custom intent.
	//   "LOCATION_GROUP" - Location group.
	//   "CUSTOM_AUDIENCE" - Custom audience
	//   "COMBINED_AUDIENCE" - Combined audience
	//   "KEYWORD_THEME" - Smart Campaign keyword theme
	//   "AUDIENCE" - Audience
	//   "LOCAL_SERVICE_ID" - Local Services Ads Service ID.
	//   "BRAND" - Brand
	//   "BRAND_LIST" - Brand List
	//   "LIFE_EVENT" - Life Event
	Type string `json:"type,omitempty"`
	// UserList: Immutable. User List.
	UserList *GoogleAdsSearchads360V0Common__UserListInfo `json:"userList,omitempty"`
	// Webpage: Immutable. Webpage
	Webpage *GoogleAdsSearchads360V0Common__WebpageInfo `json:"webpage,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdGroup") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdGroup") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AdGroupCriterion) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroupCriterion
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

func (s *GoogleAdsSearchads360V0Resources__AdGroupCriterion) UnmarshalJSON(data []byte) error {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroupCriterion
	var s1 struct {
		BidModifier gensupport.JSONFloat64 `json:"bidModifier"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.BidModifier = float64(s1.BidModifier)
	return nil
}

// GoogleAdsSearchads360V0Resources__AdGroupCriterionLabel: A relationship
// between an ad group criterion and a label.
type GoogleAdsSearchads360V0Resources__AdGroupCriterionLabel struct {
	// AdGroupCriterion: Immutable. The ad group criterion to which the label is
	// attached.
	AdGroupCriterion string `json:"adGroupCriterion,omitempty"`
	// Label: Immutable. The label assigned to the ad group criterion.
	Label string `json:"label,omitempty"`
	// ResourceName: Immutable. 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 `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdGroupCriterion") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdGroupCriterion") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AdGroupCriterionLabel) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroupCriterionLabel
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AdGroupLabel: A relationship between an ad
// group and a label.
type GoogleAdsSearchads360V0Resources__AdGroupLabel struct {
	// AdGroup: Immutable. The ad group to which the label is attached.
	AdGroup string `json:"adGroup,omitempty"`
	// Label: Immutable. The label assigned to the ad group.
	Label string `json:"label,omitempty"`
	// ResourceName: Immutable. 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 `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdGroup") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdGroup") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AdGroupLabel) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AdGroupLabel
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AgeRangeView: An age range view.
type GoogleAdsSearchads360V0Resources__AgeRangeView struct {
	// ResourceName: Output only. 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 `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ResourceName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ResourceName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AgeRangeView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AgeRangeView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__Asset: Asset is a part of an ad which can
// be shared across multiple ads. It can be an image (ImageAsset), a video
// (YoutubeVideoAsset), etc. Assets are immutable and cannot be removed. To
// stop an asset from serving, remove the asset from the entity that is using
// it.
type GoogleAdsSearchads360V0Resources__Asset struct {
	// CallAsset: Output only. A unified call asset.
	CallAsset *GoogleAdsSearchads360V0Common__UnifiedCallAsset `json:"callAsset,omitempty"`
	// CallToActionAsset: Immutable. A call to action asset.
	CallToActionAsset *GoogleAdsSearchads360V0Common__CallToActionAsset `json:"callToActionAsset,omitempty"`
	// CalloutAsset: Output only. A unified callout asset.
	CalloutAsset *GoogleAdsSearchads360V0Common__UnifiedCalloutAsset `json:"calloutAsset,omitempty"`
	// CreationTime: Output only. The timestamp when this asset was created. The
	// timestamp is in the customer's time zone and in "yyyy-MM-dd HH:mm:ss"
	// format.
	CreationTime string `json:"creationTime,omitempty"`
	// EngineStatus: Output only. The Engine Status for an asset.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "SERVING" - The asset is active.
	//   "SERVING_LIMITED" - The asset is active limited.
	//   "DISAPPROVED" - The asset is disapproved (not eligible).
	//   "DISABLED" - The asset is inactive (pending).
	//   "REMOVED" - The asset has been removed.
	EngineStatus string `json:"engineStatus,omitempty"`
	// FinalUrls: A list of possible final URLs after all cross domain redirects.
	FinalUrls []string `json:"finalUrls,omitempty"`
	// Id: Output only. The ID of the asset.
	Id int64 `json:"id,omitempty,string"`
	// ImageAsset: Output only. An image asset.
	ImageAsset *GoogleAdsSearchads360V0Common__ImageAsset `json:"imageAsset,omitempty"`
	// LastModifiedTime: Output only. The datetime when this asset was last
	// modified. The datetime is in the customer's time zone and in "yyyy-MM-dd
	// HH:mm:ss.ssssss" format.
	LastModifiedTime string `json:"lastModifiedTime,omitempty"`
	// LocationAsset: Output only. A unified location asset.
	LocationAsset *GoogleAdsSearchads360V0Common__UnifiedLocationAsset `json:"locationAsset,omitempty"`
	// MobileAppAsset: A mobile app asset.
	MobileAppAsset *GoogleAdsSearchads360V0Common__MobileAppAsset `json:"mobileAppAsset,omitempty"`
	// Name: Optional name of the asset.
	Name string `json:"name,omitempty"`
	// PageFeedAsset: Output only. A unified page feed asset.
	PageFeedAsset *GoogleAdsSearchads360V0Common__UnifiedPageFeedAsset `json:"pageFeedAsset,omitempty"`
	// ResourceName: Immutable. The resource name of the asset. Asset resource
	// names have the form: `customers/{customer_id}/assets/{asset_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// SitelinkAsset: Output only. A unified sitelink asset.
	SitelinkAsset *GoogleAdsSearchads360V0Common__UnifiedSitelinkAsset `json:"sitelinkAsset,omitempty"`
	// Status: Output only. The status of the asset.
	//
	// Possible values:
	//   "UNSPECIFIED" - The status has not been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "ENABLED" - The asset is enabled.
	//   "REMOVED" - The asset is removed.
	//   "ARCHIVED" - The asset is archived.
	//   "PENDING_SYSTEM_GENERATED" - The asset is system generated pending user
	// review.
	Status string `json:"status,omitempty"`
	// TextAsset: Output only. A text asset.
	TextAsset *GoogleAdsSearchads360V0Common__TextAsset `json:"textAsset,omitempty"`
	// TrackingUrlTemplate: URL template for constructing a tracking URL.
	TrackingUrlTemplate string `json:"trackingUrlTemplate,omitempty"`
	// Type: Output only. Type of the asset.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "YOUTUBE_VIDEO" - YouTube video asset.
	//   "MEDIA_BUNDLE" - Media bundle asset.
	//   "IMAGE" - Image asset.
	//   "TEXT" - Text asset.
	//   "LEAD_FORM" - Lead form asset.
	//   "BOOK_ON_GOOGLE" - Book on Google asset.
	//   "PROMOTION" - Promotion asset.
	//   "CALLOUT" - Callout asset.
	//   "STRUCTURED_SNIPPET" - Structured Snippet asset.
	//   "SITELINK" - Sitelink asset.
	//   "PAGE_FEED" - Page Feed asset.
	//   "DYNAMIC_EDUCATION" - Dynamic Education asset.
	//   "MOBILE_APP" - Mobile app asset.
	//   "HOTEL_CALLOUT" - Hotel callout asset.
	//   "CALL" - Call asset.
	//   "PRICE" - Price asset.
	//   "CALL_TO_ACTION" - Call to action asset.
	//   "DYNAMIC_REAL_ESTATE" - Dynamic real estate asset.
	//   "DYNAMIC_CUSTOM" - Dynamic custom asset.
	//   "DYNAMIC_HOTELS_AND_RENTALS" - Dynamic hotels and rentals asset.
	//   "DYNAMIC_FLIGHTS" - Dynamic flights asset.
	//   "DISCOVERY_CAROUSEL_CARD" - Discovery Carousel Card asset.
	//   "DYNAMIC_TRAVEL" - Dynamic travel asset.
	//   "DYNAMIC_LOCAL" - Dynamic local asset.
	//   "DYNAMIC_JOBS" - Dynamic jobs asset.
	//   "LOCATION" - Location asset.
	//   "HOTEL_PROPERTY" - Hotel property asset.
	Type string `json:"type,omitempty"`
	// YoutubeVideoAsset: Immutable. A YouTube video asset.
	YoutubeVideoAsset *GoogleAdsSearchads360V0Common__YoutubeVideoAsset `json:"youtubeVideoAsset,omitempty"`
	// ForceSendFields is a list of field names (e.g. "CallAsset") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CallAsset") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__Asset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__Asset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AssetGroup: An asset group.
// AssetGroupAsset is used to link an asset to the asset group.
// AssetGroupSignal is used to associate a signal to an asset group.
type GoogleAdsSearchads360V0Resources__AssetGroup struct {
	// AdStrength: Output only. Overall ad strength of this asset group.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "PENDING" - The ad strength is currently pending.
	//   "NO_ADS" - No ads could be generated.
	//   "POOR" - Poor strength.
	//   "AVERAGE" - Average strength.
	//   "GOOD" - Good strength.
	//   "EXCELLENT" - Excellent strength.
	AdStrength string `json:"adStrength,omitempty"`
	// Campaign: Immutable. The campaign with which this asset group is associated.
	// The asset which is linked to the asset group.
	Campaign string `json:"campaign,omitempty"`
	// FinalMobileUrls: A list of final mobile URLs after all cross domain
	// redirects. In performance max, by default, the urls are eligible for
	// expansion unless opted out.
	FinalMobileUrls []string `json:"finalMobileUrls,omitempty"`
	// FinalUrls: A list of final URLs after all cross domain redirects. In
	// performance max, by default, the urls are eligible for expansion unless
	// opted out.
	FinalUrls []string `json:"finalUrls,omitempty"`
	// Id: Output only. The ID of the asset group.
	Id int64 `json:"id,omitempty,string"`
	// Name: Required. Name of the asset group. Required. It must have a minimum
	// length of 1 and maximum length of 128. It must be unique under a campaign.
	Name string `json:"name,omitempty"`
	// Path1: First part of text that may appear appended to the url displayed in
	// the ad.
	Path1 string `json:"path1,omitempty"`
	// Path2: Second part of text that may appear appended to the url displayed in
	// the ad. This field can only be set when path1 is set.
	Path2 string `json:"path2,omitempty"`
	// ResourceName: Immutable. The resource name of the asset group. Asset group
	// resource names have the form:
	// `customers/{customer_id}/assetGroups/{asset_group_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: The status of the asset group.
	//
	// Possible values:
	//   "UNSPECIFIED" - The status has not been specified.
	//   "UNKNOWN" - The received value is not known in this version.
	//   "ENABLED" - The asset group is enabled.
	//   "PAUSED" - The asset group is paused.
	//   "REMOVED" - The asset group is removed.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdStrength") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdStrength") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AssetGroup) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AssetGroup
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AssetGroupAsset: AssetGroupAsset is the
// link between an asset and an asset group. Adding an AssetGroupAsset links an
// asset with an asset group.
type GoogleAdsSearchads360V0Resources__AssetGroupAsset struct {
	// Asset: Immutable. The asset which this asset group asset is linking.
	Asset string `json:"asset,omitempty"`
	// AssetGroup: Immutable. The asset group which this asset group asset is
	// linking.
	AssetGroup string `json:"assetGroup,omitempty"`
	// FieldType: The description of the placement of the asset within the asset
	// group. For example: HEADLINE, YOUTUBE_VIDEO etc
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "HEADLINE" - The asset is linked for use as a headline.
	//   "DESCRIPTION" - The asset is linked for use as a description.
	//   "MANDATORY_AD_TEXT" - The asset is linked for use as mandatory ad text.
	//   "MARKETING_IMAGE" - The asset is linked for use as a marketing image.
	//   "MEDIA_BUNDLE" - The asset is linked for use as a media bundle.
	//   "YOUTUBE_VIDEO" - The asset is linked for use as a YouTube video.
	//   "BOOK_ON_GOOGLE" - The asset is linked to indicate that a hotels campaign
	// is "Book on Google" enabled.
	//   "LEAD_FORM" - The asset is linked for use as a Lead Form extension.
	//   "PROMOTION" - The asset is linked for use as a Promotion extension.
	//   "CALLOUT" - The asset is linked for use as a Callout extension.
	//   "STRUCTURED_SNIPPET" - The asset is linked for use as a Structured Snippet
	// extension.
	//   "SITELINK" - The asset is linked for use as a Sitelink.
	//   "MOBILE_APP" - The asset is linked for use as a Mobile App extension.
	//   "HOTEL_CALLOUT" - The asset is linked for use as a Hotel Callout
	// extension.
	//   "CALL" - The asset is linked for use as a Call extension.
	//   "PRICE" - The asset is linked for use as a Price extension.
	//   "LONG_HEADLINE" - The asset is linked for use as a long headline.
	//   "BUSINESS_NAME" - The asset is linked for use as a business name.
	//   "SQUARE_MARKETING_IMAGE" - The asset is linked for use as a square
	// marketing image.
	//   "PORTRAIT_MARKETING_IMAGE" - The asset is linked for use as a portrait
	// marketing image.
	//   "LOGO" - The asset is linked for use as a logo.
	//   "LANDSCAPE_LOGO" - The asset is linked for use as a landscape logo.
	//   "VIDEO" - The asset is linked for use as a non YouTube logo.
	//   "CALL_TO_ACTION_SELECTION" - The asset is linked for use to select a
	// call-to-action.
	//   "AD_IMAGE" - The asset is linked for use to select an ad image.
	//   "BUSINESS_LOGO" - The asset is linked for use as a business logo.
	//   "HOTEL_PROPERTY" - The asset is linked for use as a hotel property in a
	// Performance Max for travel goals campaign.
	//   "DISCOVERY_CAROUSEL_CARD" - The asset is linked for use as a discovery
	// carousel card.
	FieldType string `json:"fieldType,omitempty"`
	// ResourceName: Immutable. The resource name of the asset group asset. Asset
	// group asset resource name have the form:
	// `customers/{customer_id}/assetGroupAssets/{asset_group_id}~{asset_id}~{field_
	// type}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: The status of the link between an asset and asset group.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ENABLED" - Asset link is enabled.
	//   "REMOVED" - Asset link has been removed.
	//   "PAUSED" - Asset link is paused.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Asset") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Asset") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AssetGroupAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AssetGroupAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AssetGroupAssetCombinationData: Asset
// group asset combination data
type GoogleAdsSearchads360V0Resources__AssetGroupAssetCombinationData struct {
	// AssetCombinationServedAssets: Output only. Served assets.
	AssetCombinationServedAssets []*GoogleAdsSearchads360V0Common__AssetUsage `json:"assetCombinationServedAssets,omitempty"`
	// ForceSendFields is a list of field names (e.g.
	// "AssetCombinationServedAssets") to unconditionally include in API requests.
	// By default, fields with empty or default values are omitted from API
	// requests. See https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields
	// for more details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AssetCombinationServedAssets") to
	// include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AssetGroupAssetCombinationData) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AssetGroupAssetCombinationData
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AssetGroupListingGroupFilter:
// AssetGroupListingGroupFilter represents a listing group filter tree node in
// an asset group.
type GoogleAdsSearchads360V0Resources__AssetGroupListingGroupFilter struct {
	// AssetGroup: Immutable. The asset group which this asset group listing group
	// filter is part of.
	AssetGroup string `json:"assetGroup,omitempty"`
	// CaseValue: Dimension value with which this listing group is refining its
	// parent. Undefined for the root group.
	CaseValue *GoogleAdsSearchads360V0Resources__ListingGroupFilterDimension `json:"caseValue,omitempty"`
	// Id: Output only. The ID of the ListingGroupFilter.
	Id int64 `json:"id,omitempty,string"`
	// ParentListingGroupFilter: Immutable. Resource name of the parent listing
	// group subdivision. Null for the root listing group filter node.
	ParentListingGroupFilter string `json:"parentListingGroupFilter,omitempty"`
	// Path: Output only. The path of dimensions defining this listing group
	// filter.
	Path *GoogleAdsSearchads360V0Resources__ListingGroupFilterDimensionPath `json:"path,omitempty"`
	// ResourceName: Immutable. The resource name of the asset group listing group
	// filter. Asset group listing group filter resource name have the form:
	// `customers/{customer_id}/assetGroupListingGroupFilters/{asset_group_id}~{list
	// ing_group_filter_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Type: Immutable. Type of a listing group filter node.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "SUBDIVISION" - Subdivision of products along some listing dimensions.
	//   "UNIT_INCLUDED" - An included listing group filter leaf node.
	//   "UNIT_EXCLUDED" - An excluded listing group filter leaf node.
	Type string `json:"type,omitempty"`
	// Vertical: Immutable. The vertical the current node tree represents. All
	// nodes in the same tree must belong to the same vertical.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "SHOPPING" - Represents the shopping vertical. The vertical is allowed
	// only in Performance Max for Retail campaigns.
	Vertical string `json:"vertical,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AssetGroup") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AssetGroup") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AssetGroupListingGroupFilter) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AssetGroupListingGroupFilter
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AssetGroupSignal: AssetGroupSignal
// represents a signal in an asset group. The existence of a signal tells the
// performance max campaign who's most likely to convert. Performance Max uses
// the signal to look for new people with similar or stronger intent to find
// conversions across Search, Display, Video, and more.
type GoogleAdsSearchads360V0Resources__AssetGroupSignal struct {
	// AssetGroup: Immutable. The asset group which this asset group signal belongs
	// to.
	AssetGroup string `json:"assetGroup,omitempty"`
	// Audience: Immutable. The audience signal to be used by the performance max
	// campaign.
	Audience *GoogleAdsSearchads360V0Common__AudienceInfo `json:"audience,omitempty"`
	// ResourceName: Immutable. The resource name of the asset group signal. Asset
	// group signal resource name have the form:
	// `customers/{customer_id}/assetGroupSignals/{asset_group_id}~{signal_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AssetGroup") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AssetGroup") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AssetGroupSignal) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AssetGroupSignal
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AssetGroupTopCombinationView: A view on
// the usage of ad group ad asset combination.
type GoogleAdsSearchads360V0Resources__AssetGroupTopCombinationView struct {
	// AssetGroupTopCombinations: Output only. The top combinations of assets that
	// served together.
	AssetGroupTopCombinations []*GoogleAdsSearchads360V0Resources__AssetGroupAssetCombinationData `json:"assetGroupTopCombinations,omitempty"`
	// ResourceName: Output only. The resource name of the asset group top
	// combination view. AssetGroup Top Combination view resource names have the
	// form:
	// "customers/{customer_id}/assetGroupTopCombinationViews/{asset_group_id}~{ass
	// et_combination_category}"
	ResourceName string `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AssetGroupTopCombinations")
	// to unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AssetGroupTopCombinations") to
	// include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AssetGroupTopCombinationView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AssetGroupTopCombinationView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AssetSet: An asset set representing a
// collection of assets. Use AssetSetAsset to link an asset to the asset set.
type GoogleAdsSearchads360V0Resources__AssetSet struct {
	// Id: Output only. The ID of the asset set.
	Id int64 `json:"id,omitempty,string"`
	// ResourceName: Immutable. The resource name of the asset set. Asset set
	// resource names have the form:
	// `customers/{customer_id}/assetSets/{asset_set_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Id") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Id") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AssetSet) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AssetSet
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__AssetSetAsset: AssetSetAsset is the link
// between an asset and an asset set. Adding an AssetSetAsset links an asset
// with an asset set.
type GoogleAdsSearchads360V0Resources__AssetSetAsset struct {
	// Asset: Immutable. The asset which this asset set asset is linking to.
	Asset string `json:"asset,omitempty"`
	// AssetSet: Immutable. The asset set which this asset set asset is linking to.
	AssetSet string `json:"assetSet,omitempty"`
	// ResourceName: Immutable. The resource name of the asset set asset. Asset set
	// asset resource names have the form:
	// `customers/{customer_id}/assetSetAssets/{asset_set_id}~{asset_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. The status of the asset set asset. Read-only.
	//
	// Possible values:
	//   "UNSPECIFIED" - The status has not been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "ENABLED" - The asset set asset is enabled.
	//   "REMOVED" - The asset set asset is removed.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Asset") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Asset") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__AssetSetAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__AssetSetAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__Audience: Audience is an effective
// targeting option that lets you intersect different segment attributes, such
// as detailed demographics and affinities, to create audiences that represent
// sections of your target segments.
type GoogleAdsSearchads360V0Resources__Audience struct {
	// Description: Description of this audience.
	Description string `json:"description,omitempty"`
	// Id: Output only. ID of the audience.
	Id int64 `json:"id,omitempty,string"`
	// Name: Required. Name of the audience. It should be unique across all
	// audiences. It must have a minimum length of 1 and maximum length of 255.
	Name string `json:"name,omitempty"`
	// ResourceName: Immutable. The resource name of the audience. Audience names
	// have the form: `customers/{customer_id}/audiences/{audience_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Description") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Description") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__Audience) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__Audience
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__BiddingStrategy: A bidding strategy.
type GoogleAdsSearchads360V0Resources__BiddingStrategy struct {
	// CampaignCount: Output only. The number of campaigns attached to this bidding
	// strategy. This field is read-only.
	CampaignCount int64 `json:"campaignCount,omitempty,string"`
	// CurrencyCode: Immutable. The currency used by the bidding strategy (ISO 4217
	// three-letter code). For bidding strategies in manager customers, this
	// currency can be set on creation and defaults to the manager customer's
	// currency. For serving customers, this field cannot be set; all strategies in
	// a serving customer implicitly use the serving customer's currency. In all
	// cases the effective_currency_code field returns the currency used by the
	// strategy.
	CurrencyCode string `json:"currencyCode,omitempty"`
	// EffectiveCurrencyCode: Output only. The currency used by the bidding
	// strategy (ISO 4217 three-letter code). For bidding strategies in manager
	// customers, this is the currency set by the advertiser when creating the
	// strategy. For serving customers, this is the customer's currency_code.
	// Bidding strategy metrics are reported in this currency. This field is
	// read-only.
	EffectiveCurrencyCode string `json:"effectiveCurrencyCode,omitempty"`
	// EnhancedCpc: 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.
	EnhancedCpc *GoogleAdsSearchads360V0Common__EnhancedCpc `json:"enhancedCpc,omitempty"`
	// Id: Output only. The ID of the bidding strategy.
	Id int64 `json:"id,omitempty,string"`
	// MaximizeConversionValue: An automated bidding strategy to help get the most
	// conversion value for your campaigns while spending your budget.
	MaximizeConversionValue *GoogleAdsSearchads360V0Common__MaximizeConversionValue `json:"maximizeConversionValue,omitempty"`
	// MaximizeConversions: An automated bidding strategy to help get the most
	// conversions for your campaigns while spending your budget.
	MaximizeConversions *GoogleAdsSearchads360V0Common__MaximizeConversions `json:"maximizeConversions,omitempty"`
	// Name: 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 string `json:"name,omitempty"`
	// NonRemovedCampaignCount: Output only. The number of non-removed campaigns
	// attached to this bidding strategy. This field is read-only.
	NonRemovedCampaignCount int64 `json:"nonRemovedCampaignCount,omitempty,string"`
	// ResourceName: Immutable. The resource name of the bidding strategy. Bidding
	// strategy resource names have the form:
	// `customers/{customer_id}/biddingStrategies/{bidding_strategy_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. The status of the bidding strategy. This field is
	// read-only.
	//
	// Possible values:
	//   "UNSPECIFIED" - No value has been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "ENABLED" - The bidding strategy is enabled.
	//   "REMOVED" - The bidding strategy is removed.
	Status string `json:"status,omitempty"`
	// TargetCpa: A bidding strategy that sets bids to help get as many conversions
	// as possible at the target cost-per-acquisition (CPA) you set.
	TargetCpa *GoogleAdsSearchads360V0Common__TargetCpa `json:"targetCpa,omitempty"`
	// TargetImpressionShare: A bidding strategy that automatically optimizes
	// towards a chosen percentage of impressions.
	TargetImpressionShare *GoogleAdsSearchads360V0Common__TargetImpressionShare `json:"targetImpressionShare,omitempty"`
	// TargetOutrankShare: A bidding strategy that sets bids based on the target
	// fraction of auctions where the advertiser should outrank a specific
	// competitor. This field is deprecated. Creating a new bidding strategy with
	// this field or attaching bidding strategies with this field to a campaign
	// will fail. Mutates to strategies that already have this scheme populated are
	// allowed.
	TargetOutrankShare *GoogleAdsSearchads360V0Common__TargetOutrankShare `json:"targetOutrankShare,omitempty"`
	// TargetRoas: A bidding strategy that helps you maximize revenue while
	// averaging a specific target Return On Ad Spend (ROAS).
	TargetRoas *GoogleAdsSearchads360V0Common__TargetRoas `json:"targetRoas,omitempty"`
	// TargetSpend: A bid strategy that sets your bids to help get as many clicks
	// as possible within your budget.
	TargetSpend *GoogleAdsSearchads360V0Common__TargetSpend `json:"targetSpend,omitempty"`
	// Type: Output only. The type of the bidding strategy. Create a bidding
	// strategy by setting the bidding scheme. This field is read-only.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "COMMISSION" - Commission is an automatic bidding strategy in which the
	// advertiser pays a certain portion of the conversion value.
	//   "ENHANCED_CPC" - 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.
	//   "INVALID" - Used for return value only. Indicates that a campaign does not
	// have a bidding strategy. This prevents the campaign from serving. For
	// example, a campaign may be attached to a manager bidding strategy and the
	// serving account is subsequently unlinked from the manager account. In this
	// case the campaign will automatically be detached from the now inaccessible
	// manager bidding strategy and transition to the INVALID bidding strategy
	// type.
	//   "MANUAL_CPA" - Manual bidding strategy that allows advertiser to set the
	// bid per advertiser-specified action.
	//   "MANUAL_CPC" - Manual click based bidding where user pays per click.
	//   "MANUAL_CPM" - Manual impression based bidding where user pays per
	// thousand impressions.
	//   "MANUAL_CPV" - A bidding strategy that pays a configurable amount per
	// video view.
	//   "MAXIMIZE_CONVERSIONS" - A bidding strategy that automatically maximizes
	// number of conversions given a daily budget.
	//   "MAXIMIZE_CONVERSION_VALUE" - An automated bidding strategy that
	// automatically sets bids to maximize revenue while spending your budget.
	//   "PAGE_ONE_PROMOTED" - 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.
	//   "PERCENT_CPC" - Percent Cpc is bidding strategy where bids are a fraction
	// of the advertised price for some good or service.
	//   "TARGET_CPA" - 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.
	//   "TARGET_CPM" - 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.
	//   "TARGET_IMPRESSION_SHARE" - 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).
	//   "TARGET_OUTRANK_SHARE" - 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.
	//   "TARGET_ROAS" - Target ROAS is an automated bidding strategy that helps
	// you maximize revenue while averaging a specific target Return On Average
	// Spend (ROAS).
	//   "TARGET_SPEND" - Target Spend is an automated bid strategy that sets your
	// bids to help get as many clicks as possible within your budget.
	Type string `json:"type,omitempty"`
	// ForceSendFields is a list of field names (e.g. "CampaignCount") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CampaignCount") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__BiddingStrategy) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__BiddingStrategy
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__Campaign: A campaign.
type GoogleAdsSearchads360V0Resources__Campaign struct {
	// AccessibleBiddingStrategy: Output only. Resource name of
	// AccessibleBiddingStrategy, a read-only view of the unrestricted attributes
	// of the attached portfolio bidding strategy identified by 'bidding_strategy'.
	// Empty, if the campaign does not use a portfolio strategy. Unrestricted
	// strategy attributes are available to all customers with whom the strategy is
	// shared and are read from the AccessibleBiddingStrategy resource. In
	// contrast, restricted attributes are only available to the owner customer of
	// the strategy and their managers. Restricted attributes can only be read from
	// the BiddingStrategy resource.
	AccessibleBiddingStrategy string `json:"accessibleBiddingStrategy,omitempty"`
	// AdServingOptimizationStatus: The ad serving optimization status of the
	// campaign.
	//
	// Possible values:
	//   "UNSPECIFIED" - No value has been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "OPTIMIZE" - Ad serving is optimized based on CTR for the campaign.
	//   "CONVERSION_OPTIMIZE" - 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.
	//   "ROTATE" - Ads are rotated evenly for 90 days, then optimized for clicks.
	//   "ROTATE_INDEFINITELY" - Show lower performing ads more evenly with higher
	// performing ads, and do not optimize.
	//   "UNAVAILABLE" - Ad serving optimization status is not available.
	AdServingOptimizationStatus string `json:"adServingOptimizationStatus,omitempty"`
	// AdvertisingChannelSubType: Immutable. 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.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used as a return value only. Represents value unknown in this
	// version.
	//   "SEARCH_MOBILE_APP" - Mobile app campaigns for Search.
	//   "DISPLAY_MOBILE_APP" - Mobile app campaigns for Display.
	//   "SEARCH_EXPRESS" - AdWords express campaigns for search.
	//   "DISPLAY_EXPRESS" - AdWords Express campaigns for display.
	//   "SHOPPING_SMART_ADS" - Smart Shopping campaigns.
	//   "DISPLAY_GMAIL_AD" - Gmail Ad campaigns.
	//   "DISPLAY_SMART_CAMPAIGN" - Smart display campaigns. New campaigns of this
	// sub type cannot be created.
	//   "VIDEO_OUTSTREAM" - Video Outstream campaigns.
	//   "VIDEO_ACTION" - Video TrueView for Action campaigns.
	//   "VIDEO_NON_SKIPPABLE" - Video campaigns with non-skippable video ads.
	//   "APP_CAMPAIGN" - App Campaign that lets you easily promote your Android or
	// iOS app across Google's top properties including Search, Play, YouTube, and
	// the Google Display Network.
	//   "APP_CAMPAIGN_FOR_ENGAGEMENT" - 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.
	//   "LOCAL_CAMPAIGN" - Campaigns specialized for local advertising.
	//   "SHOPPING_COMPARISON_LISTING_ADS" - Shopping Comparison Listing campaigns.
	//   "SMART_CAMPAIGN" - Standard Smart campaigns.
	//   "VIDEO_SEQUENCE" - Video campaigns with sequence video ads.
	//   "APP_CAMPAIGN_FOR_PRE_REGISTRATION" - App Campaign for pre registration,
	// specialized for advertising mobile app pre-registration, that targets
	// multiple advertising channels across Google Play, YouTube and Display
	// Network.
	//   "VIDEO_REACH_TARGET_FREQUENCY" - Video reach campaign with Target
	// Frequency bidding strategy.
	//   "TRAVEL_ACTIVITIES" - Travel Activities campaigns.
	AdvertisingChannelSubType string `json:"advertisingChannelSubType,omitempty"`
	// AdvertisingChannelType: Immutable. 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.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "SEARCH" - Search Network. Includes display bundled, and Search+
	// campaigns.
	//   "DISPLAY" - Google Display Network only.
	//   "SHOPPING" - Shopping campaigns serve on the shopping property and on
	// google.com search results.
	//   "HOTEL" - Hotel Ads campaigns.
	//   "VIDEO" - Video campaigns.
	//   "MULTI_CHANNEL" - App Campaigns, and App Campaigns for Engagement, that
	// run across multiple channels.
	//   "LOCAL" - Local ads campaigns.
	//   "SMART" - Smart campaigns.
	//   "PERFORMANCE_MAX" - Performance Max campaigns.
	//   "LOCAL_SERVICES" - Local services campaigns.
	//   "DISCOVERY" - Discovery campaigns.
	//   "TRAVEL" - Travel campaigns.
	AdvertisingChannelType string `json:"advertisingChannelType,omitempty"`
	// BiddingStrategy: Portfolio bidding strategy used by campaign.
	BiddingStrategy string `json:"biddingStrategy,omitempty"`
	// BiddingStrategySystemStatus: Output only. The system status of the
	// campaign's bidding strategy.
	//
	// Possible values:
	//   "UNSPECIFIED" - Signals that an unexpected error occurred, for example, no
	// bidding strategy type was found, or no status information was found.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ENABLED" - The bid strategy is active, and AdWords cannot find any
	// specific issues with the strategy.
	//   "LEARNING_NEW" - The bid strategy is learning because it has been recently
	// created or recently reactivated.
	//   "LEARNING_SETTING_CHANGE" - The bid strategy is learning because of a
	// recent setting change.
	//   "LEARNING_BUDGET_CHANGE" - The bid strategy is learning because of a
	// recent budget change.
	//   "LEARNING_COMPOSITION_CHANGE" - The bid strategy is learning because of
	// recent change in number of campaigns, ad groups or keywords attached to it.
	//   "LEARNING_CONVERSION_TYPE_CHANGE" - The bid strategy depends on conversion
	// reporting and the customer recently modified conversion types that were
	// relevant to the bid strategy.
	//   "LEARNING_CONVERSION_SETTING_CHANGE" - The bid strategy depends on
	// conversion reporting and the customer recently changed their conversion
	// settings.
	//   "LIMITED_BY_CPC_BID_CEILING" - The bid strategy is limited by its bid
	// ceiling.
	//   "LIMITED_BY_CPC_BID_FLOOR" - The bid strategy is limited by its bid floor.
	//   "LIMITED_BY_DATA" - The bid strategy is limited because there was not
	// enough conversion traffic over the past weeks.
	//   "LIMITED_BY_BUDGET" - A significant fraction of keywords in this bid
	// strategy are limited by budget.
	//   "LIMITED_BY_LOW_PRIORITY_SPEND" - The bid strategy cannot reach its target
	// spend because its spend has been de-prioritized.
	//   "LIMITED_BY_LOW_QUALITY" - A significant fraction of keywords in this bid
	// strategy have a low Quality Score.
	//   "LIMITED_BY_INVENTORY" - The bid strategy cannot fully spend its budget
	// because of narrow targeting.
	//   "MISCONFIGURED_ZERO_ELIGIBILITY" - Missing conversion tracking (no pings
	// present) and/or remarketing lists for SSC.
	//   "MISCONFIGURED_CONVERSION_TYPES" - The bid strategy depends on conversion
	// reporting and the customer is lacking conversion types that might be
	// reported against this strategy.
	//   "MISCONFIGURED_CONVERSION_SETTINGS" - The bid strategy depends on
	// conversion reporting and the customer's conversion settings are
	// misconfigured.
	//   "MISCONFIGURED_SHARED_BUDGET" - There are campaigns outside the bid
	// strategy that share budgets with campaigns included in the strategy.
	//   "MISCONFIGURED_STRATEGY_TYPE" - The campaign has an invalid strategy type
	// and is not serving.
	//   "PAUSED" - The bid strategy is not active. Either there are no active
	// campaigns, ad groups or keywords attached to the bid strategy. Or there are
	// no active budgets connected to the bid strategy.
	//   "UNAVAILABLE" - This bid strategy currently does not support status
	// reporting.
	//   "MULTIPLE_LEARNING" - There were multiple LEARNING_* system statuses for
	// this bid strategy during the time in question.
	//   "MULTIPLE_LIMITED" - There were multiple LIMITED_* system statuses for
	// this bid strategy during the time in question.
	//   "MULTIPLE_MISCONFIGURED" - There were multiple MISCONFIGURED_* system
	// statuses for this bid strategy during the time in question.
	//   "MULTIPLE" - There were multiple system statuses for this bid strategy
	// during the time in question.
	BiddingStrategySystemStatus string `json:"biddingStrategySystemStatus,omitempty"`
	// BiddingStrategyType: Output only. 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.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "COMMISSION" - Commission is an automatic bidding strategy in which the
	// advertiser pays a certain portion of the conversion value.
	//   "ENHANCED_CPC" - 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.
	//   "INVALID" - Used for return value only. Indicates that a campaign does not
	// have a bidding strategy. This prevents the campaign from serving. For
	// example, a campaign may be attached to a manager bidding strategy and the
	// serving account is subsequently unlinked from the manager account. In this
	// case the campaign will automatically be detached from the now inaccessible
	// manager bidding strategy and transition to the INVALID bidding strategy
	// type.
	//   "MANUAL_CPA" - Manual bidding strategy that allows advertiser to set the
	// bid per advertiser-specified action.
	//   "MANUAL_CPC" - Manual click based bidding where user pays per click.
	//   "MANUAL_CPM" - Manual impression based bidding where user pays per
	// thousand impressions.
	//   "MANUAL_CPV" - A bidding strategy that pays a configurable amount per
	// video view.
	//   "MAXIMIZE_CONVERSIONS" - A bidding strategy that automatically maximizes
	// number of conversions given a daily budget.
	//   "MAXIMIZE_CONVERSION_VALUE" - An automated bidding strategy that
	// automatically sets bids to maximize revenue while spending your budget.
	//   "PAGE_ONE_PROMOTED" - 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.
	//   "PERCENT_CPC" - Percent Cpc is bidding strategy where bids are a fraction
	// of the advertised price for some good or service.
	//   "TARGET_CPA" - 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.
	//   "TARGET_CPM" - 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.
	//   "TARGET_IMPRESSION_SHARE" - 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).
	//   "TARGET_OUTRANK_SHARE" - 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.
	//   "TARGET_ROAS" - Target ROAS is an automated bidding strategy that helps
	// you maximize revenue while averaging a specific target Return On Average
	// Spend (ROAS).
	//   "TARGET_SPEND" - Target Spend is an automated bid strategy that sets your
	// bids to help get as many clicks as possible within your budget.
	BiddingStrategyType string `json:"biddingStrategyType,omitempty"`
	// CampaignBudget: The budget of the campaign.
	CampaignBudget string `json:"campaignBudget,omitempty"`
	// CreateTime: Output only. The timestamp when this campaign was created. The
	// timestamp is in the customer's time zone and in "yyyy-MM-dd HH:mm:ss"
	// format. create_time will be deprecated in v1. Use creation_time instead.
	CreateTime string `json:"createTime,omitempty"`
	// CreationTime: Output only. The timestamp when this campaign was created. The
	// timestamp is in the customer's time zone and in "yyyy-MM-dd HH:mm:ss"
	// format.
	CreationTime string `json:"creationTime,omitempty"`
	// DynamicSearchAdsSetting: The setting for controlling Dynamic Search Ads
	// (DSA).
	DynamicSearchAdsSetting *GoogleAdsSearchads360V0ResourcesCampaignDynamicSearchAdsSetting `json:"dynamicSearchAdsSetting,omitempty"`
	// EndDate: The last day of the campaign in serving customer's timezone in
	// YYYY-MM-DD format. On create, defaults to 2037-12-30, which means the
	// campaign will run indefinitely. To set an existing campaign to run
	// indefinitely, set this field to 2037-12-30.
	EndDate string `json:"endDate,omitempty"`
	// EngineId: Output only. ID of the campaign in the external engine account.
	// This field is for non-Google Ads account only, for example, Yahoo Japan,
	// Microsoft, Baidu etc. For Google Ads entity, use "campaign.id" instead.
	EngineId string `json:"engineId,omitempty"`
	// ExcludedParentAssetFieldTypes: The asset field types that should be excluded
	// from this campaign. Asset links with these field types will not be inherited
	// by this campaign from the upper level.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "HEADLINE" - The asset is linked for use as a headline.
	//   "DESCRIPTION" - The asset is linked for use as a description.
	//   "MANDATORY_AD_TEXT" - The asset is linked for use as mandatory ad text.
	//   "MARKETING_IMAGE" - The asset is linked for use as a marketing image.
	//   "MEDIA_BUNDLE" - The asset is linked for use as a media bundle.
	//   "YOUTUBE_VIDEO" - The asset is linked for use as a YouTube video.
	//   "BOOK_ON_GOOGLE" - The asset is linked to indicate that a hotels campaign
	// is "Book on Google" enabled.
	//   "LEAD_FORM" - The asset is linked for use as a Lead Form extension.
	//   "PROMOTION" - The asset is linked for use as a Promotion extension.
	//   "CALLOUT" - The asset is linked for use as a Callout extension.
	//   "STRUCTURED_SNIPPET" - The asset is linked for use as a Structured Snippet
	// extension.
	//   "SITELINK" - The asset is linked for use as a Sitelink.
	//   "MOBILE_APP" - The asset is linked for use as a Mobile App extension.
	//   "HOTEL_CALLOUT" - The asset is linked for use as a Hotel Callout
	// extension.
	//   "CALL" - The asset is linked for use as a Call extension.
	//   "PRICE" - The asset is linked for use as a Price extension.
	//   "LONG_HEADLINE" - The asset is linked for use as a long headline.
	//   "BUSINESS_NAME" - The asset is linked for use as a business name.
	//   "SQUARE_MARKETING_IMAGE" - The asset is linked for use as a square
	// marketing image.
	//   "PORTRAIT_MARKETING_IMAGE" - The asset is linked for use as a portrait
	// marketing image.
	//   "LOGO" - The asset is linked for use as a logo.
	//   "LANDSCAPE_LOGO" - The asset is linked for use as a landscape logo.
	//   "VIDEO" - The asset is linked for use as a non YouTube logo.
	//   "CALL_TO_ACTION_SELECTION" - The asset is linked for use to select a
	// call-to-action.
	//   "AD_IMAGE" - The asset is linked for use to select an ad image.
	//   "BUSINESS_LOGO" - The asset is linked for use as a business logo.
	//   "HOTEL_PROPERTY" - The asset is linked for use as a hotel property in a
	// Performance Max for travel goals campaign.
	//   "DISCOVERY_CAROUSEL_CARD" - The asset is linked for use as a discovery
	// carousel card.
	ExcludedParentAssetFieldTypes []string `json:"excludedParentAssetFieldTypes,omitempty"`
	// FinalUrlSuffix: Suffix used to append query parameters to landing pages that
	// are served with parallel tracking.
	FinalUrlSuffix string `json:"finalUrlSuffix,omitempty"`
	// FrequencyCaps: A list that limits how often each user will see this
	// campaign's ads.
	FrequencyCaps []*GoogleAdsSearchads360V0Common__FrequencyCapEntry `json:"frequencyCaps,omitempty"`
	// GeoTargetTypeSetting: The setting for ads geotargeting.
	GeoTargetTypeSetting *GoogleAdsSearchads360V0ResourcesCampaignGeoTargetTypeSetting `json:"geoTargetTypeSetting,omitempty"`
	// Id: Output only. The ID of the campaign.
	Id int64 `json:"id,omitempty,string"`
	// Labels: Output only. The resource names of labels attached to this campaign.
	Labels []string `json:"labels,omitempty"`
	// LastModifiedTime: Output only. The datetime when this campaign was last
	// modified. The datetime is in the customer's time zone and in "yyyy-MM-dd
	// HH:mm:ss.ssssss" format.
	LastModifiedTime string `json:"lastModifiedTime,omitempty"`
	// ManualCpa: Standard Manual CPA bidding strategy. Manual bidding strategy
	// that allows advertiser to set the bid per advertiser-specified action.
	// Supported only for Local Services campaigns.
	ManualCpa *GoogleAdsSearchads360V0Common__ManualCpa `json:"manualCpa,omitempty"`
	// ManualCpc: Standard Manual CPC bidding strategy. Manual click-based bidding
	// where user pays per click.
	ManualCpc *GoogleAdsSearchads360V0Common__ManualCpc `json:"manualCpc,omitempty"`
	// ManualCpm: Standard Manual CPM bidding strategy. Manual impression-based
	// bidding where user pays per thousand impressions.
	ManualCpm *GoogleAdsSearchads360V0Common__ManualCpm `json:"manualCpm,omitempty"`
	// MaximizeConversionValue: Standard Maximize Conversion Value bidding strategy
	// that automatically sets bids to maximize revenue while spending your budget.
	MaximizeConversionValue *GoogleAdsSearchads360V0Common__MaximizeConversionValue `json:"maximizeConversionValue,omitempty"`
	// MaximizeConversions: Standard Maximize Conversions bidding strategy that
	// automatically maximizes number of conversions while spending your budget.
	MaximizeConversions *GoogleAdsSearchads360V0Common__MaximizeConversions `json:"maximizeConversions,omitempty"`
	// Name: 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 string `json:"name,omitempty"`
	// NetworkSettings: The network settings for the campaign.
	NetworkSettings *GoogleAdsSearchads360V0ResourcesCampaignNetworkSettings `json:"networkSettings,omitempty"`
	// OptimizationGoalSetting: Optimization goal setting for this campaign, which
	// includes a set of optimization goal types.
	OptimizationGoalSetting *GoogleAdsSearchads360V0ResourcesCampaignOptimizationGoalSetting `json:"optimizationGoalSetting,omitempty"`
	// PercentCpc: Standard Percent Cpc bidding strategy where bids are a fraction
	// of the advertised price for some good or service.
	PercentCpc *GoogleAdsSearchads360V0Common__PercentCpc `json:"percentCpc,omitempty"`
	// RealTimeBiddingSetting: Settings for Real-Time Bidding, a feature only
	// available for campaigns targeting the Ad Exchange network.
	RealTimeBiddingSetting *GoogleAdsSearchads360V0Common__RealTimeBiddingSetting `json:"realTimeBiddingSetting,omitempty"`
	// ResourceName: Immutable. The resource name of the campaign. Campaign
	// resource names have the form:
	// `customers/{customer_id}/campaigns/{campaign_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// SelectiveOptimization: Selective optimization setting for this campaign,
	// which includes a set of conversion actions to optimize this campaign
	// towards. This feature only applies to app campaigns that use MULTI_CHANNEL
	// as AdvertisingChannelType and APP_CAMPAIGN or APP_CAMPAIGN_FOR_ENGAGEMENT as
	// AdvertisingChannelSubType.
	SelectiveOptimization *GoogleAdsSearchads360V0ResourcesCampaignSelectiveOptimization `json:"selectiveOptimization,omitempty"`
	// ServingStatus: Output only. The ad serving status of the campaign.
	//
	// Possible values:
	//   "UNSPECIFIED" - No value has been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "SERVING" - Serving.
	//   "NONE" - None.
	//   "ENDED" - Ended.
	//   "PENDING" - Pending.
	//   "SUSPENDED" - Suspended.
	ServingStatus string `json:"servingStatus,omitempty"`
	// ShoppingSetting: The setting for controlling Shopping campaigns.
	ShoppingSetting *GoogleAdsSearchads360V0ResourcesCampaignShoppingSetting `json:"shoppingSetting,omitempty"`
	// StartDate: The date when campaign started in serving customer's timezone in
	// YYYY-MM-DD format.
	StartDate string `json:"startDate,omitempty"`
	// Status: The status of the campaign. When a new campaign is added, the status
	// defaults to ENABLED.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ENABLED" - Campaign is active and can show ads.
	//   "PAUSED" - Campaign has been paused by the user.
	//   "REMOVED" - Campaign has been removed.
	Status string `json:"status,omitempty"`
	// TargetCpa: Standard Target CPA bidding strategy that automatically sets bids
	// to help get as many conversions as possible at the target
	// cost-per-acquisition (CPA) you set.
	TargetCpa *GoogleAdsSearchads360V0Common__TargetCpa `json:"targetCpa,omitempty"`
	// TargetCpm: A bidding strategy that automatically optimizes cost per thousand
	// impressions.
	TargetCpm *GoogleAdsSearchads360V0Common__TargetCpm `json:"targetCpm,omitempty"`
	// TargetImpressionShare: Target Impression Share bidding strategy. An
	// automated bidding strategy that sets bids to achieve a chosen percentage of
	// impressions.
	TargetImpressionShare *GoogleAdsSearchads360V0Common__TargetImpressionShare `json:"targetImpressionShare,omitempty"`
	// TargetRoas: Standard Target ROAS bidding strategy that automatically
	// maximizes revenue while averaging a specific target return on ad spend
	// (ROAS).
	TargetRoas *GoogleAdsSearchads360V0Common__TargetRoas `json:"targetRoas,omitempty"`
	// TargetSpend: Standard Target Spend bidding strategy that automatically sets
	// your bids to help get as many clicks as possible within your budget.
	TargetSpend *GoogleAdsSearchads360V0Common__TargetSpend `json:"targetSpend,omitempty"`
	// TrackingSetting: Output only. Campaign-level settings for tracking
	// information.
	TrackingSetting *GoogleAdsSearchads360V0ResourcesCampaignTrackingSetting `json:"trackingSetting,omitempty"`
	// TrackingUrlTemplate: The URL template for constructing a tracking URL.
	TrackingUrlTemplate string `json:"trackingUrlTemplate,omitempty"`
	// UrlCustomParameters: The list of mappings used to substitute custom
	// parameter tags in a `tracking_url_template`, `final_urls`, or
	// `mobile_final_urls`.
	UrlCustomParameters []*GoogleAdsSearchads360V0Common__CustomParameter `json:"urlCustomParameters,omitempty"`
	// UrlExpansionOptOut: Represents opting out of URL expansion to more targeted
	// URLs. If opted out (true), only the final URLs in the asset group or URLs
	// specified in the advertiser's Google Merchant Center or business data feeds
	// are targeted. If opted in (false), the entire domain will be targeted. This
	// field can only be set for Performance Max campaigns, where the default value
	// is false.
	UrlExpansionOptOut bool `json:"urlExpansionOptOut,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AccessibleBiddingStrategy")
	// to unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AccessibleBiddingStrategy") to
	// include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__Campaign) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__Campaign
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__CampaignAsset: A link between a Campaign
// and an Asset.
type GoogleAdsSearchads360V0Resources__CampaignAsset struct {
	// Asset: Immutable. The asset which is linked to the campaign.
	Asset string `json:"asset,omitempty"`
	// Campaign: Immutable. The campaign to which the asset is linked.
	Campaign string `json:"campaign,omitempty"`
	// ResourceName: Immutable. The resource name of the campaign asset.
	// CampaignAsset resource names have the form:
	// `customers/{customer_id}/campaignAssets/{campaign_id}~{asset_id}~{field_type}
	// `
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. Status of the campaign asset.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ENABLED" - Asset link is enabled.
	//   "REMOVED" - Asset link has been removed.
	//   "PAUSED" - Asset link is paused.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Asset") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Asset") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CampaignAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CampaignAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__CampaignAssetSet: CampaignAssetSet is the
// linkage between a campaign and an asset set. Adding a CampaignAssetSet links
// an asset set with a campaign.
type GoogleAdsSearchads360V0Resources__CampaignAssetSet struct {
	// AssetSet: Immutable. The asset set which is linked to the campaign.
	AssetSet string `json:"assetSet,omitempty"`
	// Campaign: Immutable. The campaign to which this asset set is linked.
	Campaign string `json:"campaign,omitempty"`
	// ResourceName: Immutable. The resource name of the campaign asset set. Asset
	// set asset resource names have the form:
	// `customers/{customer_id}/campaignAssetSets/{campaign_id}~{asset_set_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. The status of the campaign asset set asset. Read-only.
	//
	// Possible values:
	//   "UNSPECIFIED" - The status has not been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "ENABLED" - The linkage between asset set and its container is enabled.
	//   "REMOVED" - The linkage between asset set and its container is removed.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AssetSet") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AssetSet") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CampaignAssetSet) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CampaignAssetSet
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__CampaignAudienceView: 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 GoogleAdsSearchads360V0Resources__CampaignAudienceView struct {
	// ResourceName: Output only. 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 `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ResourceName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ResourceName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CampaignAudienceView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CampaignAudienceView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__CampaignBudget: A campaign budget.
type GoogleAdsSearchads360V0Resources__CampaignBudget struct {
	// AmountMicros: 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 int64 `json:"amountMicros,omitempty,string"`
	// DeliveryMethod: The delivery method that determines the rate at which the
	// campaign budget is spent. Defaults to STANDARD if unspecified in a create
	// operation.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "STANDARD" - The budget server will throttle serving evenly across the
	// entire time period.
	//   "ACCELERATED" - The budget server will not throttle serving, and ads will
	// serve as fast as possible.
	DeliveryMethod string `json:"deliveryMethod,omitempty"`
	// Period: Immutable. Period over which to spend the budget. Defaults to DAILY
	// if not specified.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "DAILY" - Daily budget.
	//   "FIXED_DAILY" - Fixed daily budget.
	//   "CUSTOM_PERIOD" - Custom budget can be used with total_amount to specify
	// lifetime budget limit.
	Period string `json:"period,omitempty"`
	// ResourceName: Immutable. The resource name of the campaign budget. Campaign
	// budget resource names have the form:
	// `customers/{customer_id}/campaignBudgets/{campaign_budget_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AmountMicros") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AmountMicros") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CampaignBudget) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CampaignBudget
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__CampaignCriterion: A campaign criterion.
type GoogleAdsSearchads360V0Resources__CampaignCriterion struct {
	// AgeRange: Immutable. Age range.
	AgeRange *GoogleAdsSearchads360V0Common__AgeRangeInfo `json:"ageRange,omitempty"`
	// BidModifier: 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 float64 `json:"bidModifier,omitempty"`
	// CriterionId: Output only. The ID of the criterion. This field is ignored
	// during mutate.
	CriterionId int64 `json:"criterionId,omitempty,string"`
	// Device: Immutable. Device.
	Device *GoogleAdsSearchads360V0Common__DeviceInfo `json:"device,omitempty"`
	// DisplayName: Output only. The display name of the criterion. This field is
	// ignored for mutates.
	DisplayName string `json:"displayName,omitempty"`
	// Gender: Immutable. Gender.
	Gender *GoogleAdsSearchads360V0Common__GenderInfo `json:"gender,omitempty"`
	// Keyword: Immutable. Keyword.
	Keyword *GoogleAdsSearchads360V0Common__KeywordInfo `json:"keyword,omitempty"`
	// Language: Immutable. Language.
	Language *GoogleAdsSearchads360V0Common__LanguageInfo `json:"language,omitempty"`
	// LastModifiedTime: Output only. The datetime when this campaign criterion was
	// last modified. The datetime is in the customer's time zone and in
	// "yyyy-MM-dd HH:mm:ss.ssssss" format.
	LastModifiedTime string `json:"lastModifiedTime,omitempty"`
	// Location: Immutable. Location.
	Location *GoogleAdsSearchads360V0Common__LocationInfo `json:"location,omitempty"`
	// LocationGroup: Immutable. Location Group
	LocationGroup *GoogleAdsSearchads360V0Common__LocationGroupInfo `json:"locationGroup,omitempty"`
	// Negative: Immutable. Whether to target (`false`) or exclude (`true`) the
	// criterion.
	Negative bool `json:"negative,omitempty"`
	// ResourceName: Immutable. The resource name of the campaign criterion.
	// Campaign criterion resource names have the form:
	// `customers/{customer_id}/campaignCriteria/{campaign_id}~{criterion_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: The status of the criterion.
	//
	// Possible values:
	//   "UNSPECIFIED" - No value has been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "ENABLED" - The campaign criterion is enabled.
	//   "PAUSED" - The campaign criterion is paused.
	//   "REMOVED" - The campaign criterion is removed.
	Status string `json:"status,omitempty"`
	// Type: Output only. The type of the criterion.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "KEYWORD" - Keyword, for example, 'mars cruise'.
	//   "PLACEMENT" - Placement, also known as Website, for example,
	// 'www.flowers4sale.com'
	//   "MOBILE_APP_CATEGORY" - Mobile application categories to target.
	//   "MOBILE_APPLICATION" - Mobile applications to target.
	//   "DEVICE" - Devices to target.
	//   "LOCATION" - Locations to target.
	//   "LISTING_GROUP" - Listing groups to target.
	//   "AD_SCHEDULE" - Ad Schedule.
	//   "AGE_RANGE" - Age range.
	//   "GENDER" - Gender.
	//   "INCOME_RANGE" - Income Range.
	//   "PARENTAL_STATUS" - Parental status.
	//   "YOUTUBE_VIDEO" - YouTube Video.
	//   "YOUTUBE_CHANNEL" - YouTube Channel.
	//   "USER_LIST" - User list.
	//   "PROXIMITY" - Proximity.
	//   "TOPIC" - A topic target on the display network (for example, "Pets &
	// Animals").
	//   "LISTING_SCOPE" - Listing scope to target.
	//   "LANGUAGE" - Language.
	//   "IP_BLOCK" - IpBlock.
	//   "CONTENT_LABEL" - Content Label for category exclusion.
	//   "CARRIER" - Carrier.
	//   "USER_INTEREST" - A category the user is interested in.
	//   "WEBPAGE" - Webpage criterion for dynamic search ads.
	//   "OPERATING_SYSTEM_VERSION" - Operating system version.
	//   "APP_PAYMENT_MODEL" - App payment model.
	//   "MOBILE_DEVICE" - Mobile device.
	//   "CUSTOM_AFFINITY" - Custom affinity.
	//   "CUSTOM_INTENT" - Custom intent.
	//   "LOCATION_GROUP" - Location group.
	//   "CUSTOM_AUDIENCE" - Custom audience
	//   "COMBINED_AUDIENCE" - Combined audience
	//   "KEYWORD_THEME" - Smart Campaign keyword theme
	//   "AUDIENCE" - Audience
	//   "LOCAL_SERVICE_ID" - Local Services Ads Service ID.
	//   "BRAND" - Brand
	//   "BRAND_LIST" - Brand List
	//   "LIFE_EVENT" - Life Event
	Type string `json:"type,omitempty"`
	// UserList: Immutable. User List.
	UserList *GoogleAdsSearchads360V0Common__UserListInfo `json:"userList,omitempty"`
	// Webpage: Immutable. Webpage.
	Webpage *GoogleAdsSearchads360V0Common__WebpageInfo `json:"webpage,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AgeRange") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AgeRange") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CampaignCriterion) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CampaignCriterion
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

func (s *GoogleAdsSearchads360V0Resources__CampaignCriterion) UnmarshalJSON(data []byte) error {
	type NoMethod GoogleAdsSearchads360V0Resources__CampaignCriterion
	var s1 struct {
		BidModifier gensupport.JSONFloat64 `json:"bidModifier"`
		*NoMethod
	}
	s1.NoMethod = (*NoMethod)(s)
	if err := json.Unmarshal(data, &s1); err != nil {
		return err
	}
	s.BidModifier = float64(s1.BidModifier)
	return nil
}

// GoogleAdsSearchads360V0Resources__CampaignLabel: Represents a relationship
// between a campaign and a label.
type GoogleAdsSearchads360V0Resources__CampaignLabel struct {
	// Campaign: Immutable. The campaign to which the label is attached.
	Campaign string `json:"campaign,omitempty"`
	// Label: Immutable. The label assigned to the campaign.
	Label string `json:"label,omitempty"`
	// ResourceName: Immutable. Name of the resource. Campaign label resource names
	// have the form:
	// `customers/{customer_id}/campaignLabels/{campaign_id}~{label_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Campaign") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Campaign") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CampaignLabel) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CampaignLabel
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__CartDataSalesView: Cart data sales view.
type GoogleAdsSearchads360V0Resources__CartDataSalesView struct {
	// ResourceName: Output only. The resource name of the Cart data sales view.
	// Cart data sales view resource names have the form:
	// `customers/{customer_id}/cartDataSalesView`
	ResourceName string `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ResourceName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ResourceName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CartDataSalesView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CartDataSalesView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__Conversion: A conversion.
type GoogleAdsSearchads360V0Resources__Conversion struct {
	// AdId: Output only. Ad ID. A value of 0 indicates that the ad is
	// unattributed.
	AdId int64 `json:"adId,omitempty,string"`
	// AdvertiserConversionId: Output only. For offline conversions, this is an ID
	// provided by advertisers. If an advertiser doesn't specify such an ID, Search
	// Ads 360 generates one. For online conversions, this is equal to the id
	// column or the floodlight_order_id column depending on the advertiser's
	// Floodlight instructions.
	AdvertiserConversionId string `json:"advertiserConversionId,omitempty"`
	// AssetFieldType: Output only. Asset field type of the conversion event.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "HEADLINE" - The asset is linked for use as a headline.
	//   "DESCRIPTION" - The asset is linked for use as a description.
	//   "MANDATORY_AD_TEXT" - The asset is linked for use as mandatory ad text.
	//   "MARKETING_IMAGE" - The asset is linked for use as a marketing image.
	//   "MEDIA_BUNDLE" - The asset is linked for use as a media bundle.
	//   "YOUTUBE_VIDEO" - The asset is linked for use as a YouTube video.
	//   "BOOK_ON_GOOGLE" - The asset is linked to indicate that a hotels campaign
	// is "Book on Google" enabled.
	//   "LEAD_FORM" - The asset is linked for use as a Lead Form extension.
	//   "PROMOTION" - The asset is linked for use as a Promotion extension.
	//   "CALLOUT" - The asset is linked for use as a Callout extension.
	//   "STRUCTURED_SNIPPET" - The asset is linked for use as a Structured Snippet
	// extension.
	//   "SITELINK" - The asset is linked for use as a Sitelink.
	//   "MOBILE_APP" - The asset is linked for use as a Mobile App extension.
	//   "HOTEL_CALLOUT" - The asset is linked for use as a Hotel Callout
	// extension.
	//   "CALL" - The asset is linked for use as a Call extension.
	//   "PRICE" - The asset is linked for use as a Price extension.
	//   "LONG_HEADLINE" - The asset is linked for use as a long headline.
	//   "BUSINESS_NAME" - The asset is linked for use as a business name.
	//   "SQUARE_MARKETING_IMAGE" - The asset is linked for use as a square
	// marketing image.
	//   "PORTRAIT_MARKETING_IMAGE" - The asset is linked for use as a portrait
	// marketing image.
	//   "LOGO" - The asset is linked for use as a logo.
	//   "LANDSCAPE_LOGO" - The asset is linked for use as a landscape logo.
	//   "VIDEO" - The asset is linked for use as a non YouTube logo.
	//   "CALL_TO_ACTION_SELECTION" - The asset is linked for use to select a
	// call-to-action.
	//   "AD_IMAGE" - The asset is linked for use to select an ad image.
	//   "BUSINESS_LOGO" - The asset is linked for use as a business logo.
	//   "HOTEL_PROPERTY" - The asset is linked for use as a hotel property in a
	// Performance Max for travel goals campaign.
	//   "DISCOVERY_CAROUSEL_CARD" - The asset is linked for use as a discovery
	// carousel card.
	AssetFieldType string `json:"assetFieldType,omitempty"`
	// AssetId: Output only. ID of the asset which was interacted with during the
	// conversion event.
	AssetId int64 `json:"assetId,omitempty,string"`
	// AttributionType: Output only. What the conversion is attributed to: Visit or
	// Keyword+Ad.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "VISIT" - The conversion is attributed to a visit.
	//   "CRITERION_AD" - The conversion is attributed to a criterion and ad pair.
	AttributionType string `json:"attributionType,omitempty"`
	// ClickId: Output only. A unique string, for the visit that the conversion is
	// attributed to, that is passed to the landing page as the click id URL
	// parameter.
	ClickId string `json:"clickId,omitempty"`
	// ConversionDateTime: Output only. The timestamp of the conversion event.
	ConversionDateTime string `json:"conversionDateTime,omitempty"`
	// ConversionLastModifiedDateTime: Output only. The timestamp of the last time
	// the conversion was modified.
	ConversionLastModifiedDateTime string `json:"conversionLastModifiedDateTime,omitempty"`
	// ConversionQuantity: Output only. The quantity of items recorded by the
	// conversion, as determined by the qty url parameter. The advertiser is
	// responsible for dynamically populating the parameter (such as number of
	// items sold in the conversion), otherwise it defaults to 1.
	ConversionQuantity int64 `json:"conversionQuantity,omitempty,string"`
	// ConversionRevenueMicros: Output only. The adjusted revenue in micros for the
	// conversion event. This will always be in the currency of the serving
	// account.
	ConversionRevenueMicros int64 `json:"conversionRevenueMicros,omitempty,string"`
	// ConversionVisitDateTime: Output only. The timestamp of the visit that the
	// conversion is attributed to.
	ConversionVisitDateTime string `json:"conversionVisitDateTime,omitempty"`
	// CriterionId: Output only. Search Ads 360 criterion ID. A value of 0
	// indicates that the criterion is unattributed.
	CriterionId int64 `json:"criterionId,omitempty,string"`
	// FloodlightOrderId: Output only. The Floodlight order ID provided by the
	// advertiser for the conversion.
	FloodlightOrderId string `json:"floodlightOrderId,omitempty"`
	// FloodlightOriginalRevenue: Output only. The original, unchanged revenue
	// associated with the Floodlight event (in the currency of the current
	// report), before Floodlight currency instruction modifications.
	FloodlightOriginalRevenue int64 `json:"floodlightOriginalRevenue,omitempty,string"`
	// Id: Output only. The ID of the conversion
	Id int64 `json:"id,omitempty,string"`
	// MerchantId: Output only. The SearchAds360 inventory account ID containing
	// the product that was clicked on. SearchAds360 generates this ID when you
	// link an inventory account in SearchAds360.
	MerchantId int64 `json:"merchantId,omitempty,string"`
	// ProductChannel: Output only. The sales channel of the product that was
	// clicked on: Online or Local.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ONLINE" - The item is sold online.
	//   "LOCAL" - The item is sold in local stores.
	ProductChannel string `json:"productChannel,omitempty"`
	// ProductCountryCode: Output only. The country (ISO-3166-format) registered
	// for the inventory feed that contains the product clicked on.
	ProductCountryCode string `json:"productCountryCode,omitempty"`
	// ProductId: Output only. The ID of the product clicked on.
	ProductId string `json:"productId,omitempty"`
	// ProductLanguageCode: Output only. The language (ISO-639-1) that has been set
	// for the Merchant Center feed containing data about the product.
	ProductLanguageCode string `json:"productLanguageCode,omitempty"`
	// ProductStoreId: Output only. The store in the Local Inventory Ad that was
	// clicked on. This should match the store IDs used in your local products
	// feed.
	ProductStoreId string `json:"productStoreId,omitempty"`
	// ResourceName: Output only. The resource name of the conversion. Conversion
	// resource names have the form:
	// `customers/{customer_id}/conversions/{ad_group_id}~{criterion_id}~{ds_convers
	// ion_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. The status of the conversion, either ENABLED or
	// REMOVED..
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ENABLED" - The conversion is enabled.
	//   "REMOVED" - The conversion has been removed.
	Status string `json:"status,omitempty"`
	// VisitId: Output only. The SearchAds360 visit ID that the conversion is
	// attributed to.
	VisitId int64 `json:"visitId,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "AdId") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdId") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__Conversion) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__Conversion
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__ConversionAction: A conversion action.
type GoogleAdsSearchads360V0Resources__ConversionAction struct {
	// AppId: App ID for an app conversion action.
	AppId string `json:"appId,omitempty"`
	// AttributionModelSettings: Settings related to this conversion action's
	// attribution model.
	AttributionModelSettings *GoogleAdsSearchads360V0ResourcesConversionActionAttributionModelSettings `json:"attributionModelSettings,omitempty"`
	// Category: The category of conversions reported for this conversion action.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "DEFAULT" - Default category.
	//   "PAGE_VIEW" - User visiting a page.
	//   "PURCHASE" - Purchase, sales, or "order placed" event.
	//   "SIGNUP" - Signup user action.
	//   "LEAD" - Lead-generating action.
	//   "DOWNLOAD" - Software download action (as for an app).
	//   "ADD_TO_CART" - The addition of items to a shopping cart or bag on an
	// advertiser site.
	//   "BEGIN_CHECKOUT" - When someone enters the checkout flow on an advertiser
	// site.
	//   "SUBSCRIBE_PAID" - The start of a paid subscription for a product or
	// service.
	//   "PHONE_CALL_LEAD" - A call to indicate interest in an advertiser's
	// offering.
	//   "IMPORTED_LEAD" - A lead conversion imported from an external source into
	// Google Ads.
	//   "SUBMIT_LEAD_FORM" - A submission of a form on an advertiser site
	// indicating business interest.
	//   "BOOK_APPOINTMENT" - A booking of an appointment with an advertiser's
	// business.
	//   "REQUEST_QUOTE" - A quote or price estimate request.
	//   "GET_DIRECTIONS" - A search for an advertiser's business location with
	// intention to visit.
	//   "OUTBOUND_CLICK" - A click to an advertiser's partner's site.
	//   "CONTACT" - A call, SMS, email, chat or other type of contact to an
	// advertiser.
	//   "ENGAGEMENT" - A website engagement event such as long site time or a
	// Google Analytics (GA) Smart Goal. Intended to be used for GA, Firebase, GA
	// Gold goal imports.
	//   "STORE_VISIT" - A visit to a physical store location.
	//   "STORE_SALE" - A sale occurring in a physical store.
	//   "QUALIFIED_LEAD" - A lead conversion imported from an external source into
	// Google Ads, that has been further qualified by the advertiser
	// (marketing/sales team). In the lead-to-sale journey, advertisers get leads,
	// then act on them by reaching out to the consumer. If the consumer is
	// interested and may end up buying their product, the advertiser marks such
	// leads as "qualified leads".
	//   "CONVERTED_LEAD" - A lead conversion imported from an external source into
	// Google Ads, that has further completed a chosen stage as defined by the lead
	// gen advertiser.
	Category string `json:"category,omitempty"`
	// ClickThroughLookbackWindowDays: The maximum number of days that may elapse
	// between an interaction (for example, a click) and a conversion event.
	ClickThroughLookbackWindowDays int64 `json:"clickThroughLookbackWindowDays,omitempty,string"`
	// CreationTime: Output only. Timestamp of the Floodlight activity's creation,
	// formatted in ISO 8601.
	CreationTime string `json:"creationTime,omitempty"`
	// FloodlightSettings: Output only. Floodlight settings for Floodlight
	// conversion types.
	FloodlightSettings *GoogleAdsSearchads360V0ResourcesConversionActionFloodlightSettings `json:"floodlightSettings,omitempty"`
	// Id: Output only. The ID of the conversion action.
	Id int64 `json:"id,omitempty,string"`
	// IncludeInClientAccountConversionsMetric: Whether this conversion action
	// should be included in the "client_account_conversions" metric.
	IncludeInClientAccountConversionsMetric bool `json:"includeInClientAccountConversionsMetric,omitempty"`
	// IncludeInConversionsMetric: Output only. Whether this conversion action
	// should be included in the "conversions" metric.
	IncludeInConversionsMetric bool `json:"includeInConversionsMetric,omitempty"`
	// Name: The name of the conversion action. This field is required and should
	// not be empty when creating new conversion actions.
	Name string `json:"name,omitempty"`
	// OwnerCustomer: Output only. The resource name of the conversion action owner
	// customer, or null if this is a system-defined conversion action.
	OwnerCustomer string `json:"ownerCustomer,omitempty"`
	// PrimaryForGoal: If a conversion action's primary_for_goal bit is false, the
	// conversion action is non-biddable for all campaigns regardless of their
	// customer conversion goal or campaign conversion goal. However, custom
	// conversion goals do not respect primary_for_goal, so if a campaign has a
	// custom conversion goal configured with a primary_for_goal = false conversion
	// action, that conversion action is still biddable. By default,
	// primary_for_goal will be true if not set. In V9, primary_for_goal can only
	// be set to false after creation through an 'update' operation because it's
	// not declared as optional.
	PrimaryForGoal bool `json:"primaryForGoal,omitempty"`
	// ResourceName: Immutable. The resource name of the conversion action.
	// Conversion action resource names have the form:
	// `customers/{customer_id}/conversionActions/{conversion_action_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: The status of this conversion action for conversion event accrual.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ENABLED" - Conversions will be recorded.
	//   "REMOVED" - Conversions will not be recorded.
	//   "HIDDEN" - Conversions will not be recorded and the conversion action will
	// not appear in the UI.
	Status string `json:"status,omitempty"`
	// Type: Immutable. The type of this conversion action.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "AD_CALL" - Conversions that occur when a user clicks on an ad's call
	// extension.
	//   "CLICK_TO_CALL" - Conversions that occur when a user on a mobile device
	// clicks a phone number.
	//   "GOOGLE_PLAY_DOWNLOAD" - Conversions that occur when a user downloads a
	// mobile app from the Google Play Store.
	//   "GOOGLE_PLAY_IN_APP_PURCHASE" - Conversions that occur when a user makes a
	// purchase in an app through Android billing.
	//   "UPLOAD_CALLS" - Call conversions that are tracked by the advertiser and
	// uploaded.
	//   "UPLOAD_CLICKS" - Conversions that are tracked by the advertiser and
	// uploaded with attributed clicks.
	//   "WEBPAGE" - Conversions that occur on a webpage.
	//   "WEBSITE_CALL" - Conversions that occur when a user calls a
	// dynamically-generated phone number from an advertiser's website.
	//   "STORE_SALES_DIRECT_UPLOAD" - Store Sales conversion based on first-party
	// or third-party merchant data uploads. Only customers on the allowlist can
	// use store sales direct upload types.
	//   "STORE_SALES" - Store Sales conversion based on first-party or third-party
	// merchant data uploads and/or from in-store purchases using cards from
	// payment networks. Only customers on the allowlist can use store sales types.
	// Read only.
	//   "FIREBASE_ANDROID_FIRST_OPEN" - Android app first open conversions tracked
	// through Firebase.
	//   "FIREBASE_ANDROID_IN_APP_PURCHASE" - Android app in app purchase
	// conversions tracked through Firebase.
	//   "FIREBASE_ANDROID_CUSTOM" - Android app custom conversions tracked through
	// Firebase.
	//   "FIREBASE_IOS_FIRST_OPEN" - iOS app first open conversions tracked through
	// Firebase.
	//   "FIREBASE_IOS_IN_APP_PURCHASE" - iOS app in app purchase conversions
	// tracked through Firebase.
	//   "FIREBASE_IOS_CUSTOM" - iOS app custom conversions tracked through
	// Firebase.
	//   "THIRD_PARTY_APP_ANALYTICS_ANDROID_FIRST_OPEN" - Android app first open
	// conversions tracked through Third Party App Analytics.
	//   "THIRD_PARTY_APP_ANALYTICS_ANDROID_IN_APP_PURCHASE" - Android app in app
	// purchase conversions tracked through Third Party App Analytics.
	//   "THIRD_PARTY_APP_ANALYTICS_ANDROID_CUSTOM" - Android app custom
	// conversions tracked through Third Party App Analytics.
	//   "THIRD_PARTY_APP_ANALYTICS_IOS_FIRST_OPEN" - iOS app first open
	// conversions tracked through Third Party App Analytics.
	//   "THIRD_PARTY_APP_ANALYTICS_IOS_IN_APP_PURCHASE" - iOS app in app purchase
	// conversions tracked through Third Party App Analytics.
	//   "THIRD_PARTY_APP_ANALYTICS_IOS_CUSTOM" - iOS app custom conversions
	// tracked through Third Party App Analytics.
	//   "ANDROID_APP_PRE_REGISTRATION" - Conversions that occur when a user
	// pre-registers a mobile app from the Google Play Store. Read only.
	//   "ANDROID_INSTALLS_ALL_OTHER_APPS" - Conversions that track all Google Play
	// downloads which aren't tracked by an app-specific type. Read only.
	//   "FLOODLIGHT_ACTION" - Floodlight activity that counts the number of times
	// that users have visited a particular webpage after seeing or clicking on one
	// of an advertiser's ads. Read only.
	//   "FLOODLIGHT_TRANSACTION" - Floodlight activity that tracks the number of
	// sales made or the number of items purchased. Can also capture the total
	// value of each sale. Read only.
	//   "GOOGLE_HOSTED" - Conversions that track local actions from Google's
	// products and services after interacting with an ad. Read only.
	//   "LEAD_FORM_SUBMIT" - Conversions reported when a user submits a lead form.
	// Read only.
	//   "SALESFORCE" - Conversions that come from Salesforce. Read only.
	//   "SEARCH_ADS_360" - Conversions imported from Search Ads 360 Floodlight
	// data. Read only.
	//   "SMART_CAMPAIGN_AD_CLICKS_TO_CALL" - Call conversions that occur on Smart
	// campaign Ads without call tracking setup, using Smart campaign custom
	// criteria. Read only.
	//   "SMART_CAMPAIGN_MAP_CLICKS_TO_CALL" - The user clicks on a call element
	// within Google Maps. Smart campaign only. Read only.
	//   "SMART_CAMPAIGN_MAP_DIRECTIONS" - The user requests directions to a
	// business location within Google Maps. Smart campaign only. Read only.
	//   "SMART_CAMPAIGN_TRACKED_CALLS" - Call conversions that occur on Smart
	// campaign Ads with call tracking setup, using Smart campaign custom criteria.
	// Read only.
	//   "STORE_VISITS" - Conversions that occur when a user visits an advertiser's
	// retail store. Read only.
	//   "WEBPAGE_CODELESS" - Conversions created from website events (such as form
	// submissions or page loads), that don't use individually coded event
	// snippets. Read only.
	//   "UNIVERSAL_ANALYTICS_GOAL" - Conversions that come from linked Universal
	// Analytics goals.
	//   "UNIVERSAL_ANALYTICS_TRANSACTION" - Conversions that come from linked
	// Universal Analytics transactions.
	//   "GOOGLE_ANALYTICS_4_CUSTOM" - Conversions that come from linked Google
	// Analytics 4 custom event conversions.
	//   "GOOGLE_ANALYTICS_4_PURCHASE" - Conversions that come from linked Google
	// Analytics 4 purchase conversions.
	Type string `json:"type,omitempty"`
	// ValueSettings: Settings related to the value for conversion events
	// associated with this conversion action.
	ValueSettings *GoogleAdsSearchads360V0ResourcesConversionActionValueSettings `json:"valueSettings,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AppId") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AppId") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__ConversionAction) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__ConversionAction
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__ConversionCustomVariable: A conversion
// custom variable. See "About custom Floodlight metrics and dimensions in the
// new Search Ads 360" at https://support.google.com/sa360/answer/13567857
type GoogleAdsSearchads360V0Resources__ConversionCustomVariable struct {
	// Cardinality: Output only. Cardinality of the conversion custom variable.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "BELOW_ALL_LIMITS" - The conversion custom variable has cardinality below
	// all limits. The variable can be used for segmentation, and stats can accrue
	// for new values if the variable is enabled.
	//   "EXCEEDS_SEGMENTATION_LIMIT_BUT_NOT_STATS_LIMIT" - The conversion custom
	// variable has cardinality that exceeds the segmentation limit, but does not
	// exceed the stats limit. Segmentation will be disabled, but stats can accrue
	// for new values if the variable is enabled.
	//   "APPROACHES_STATS_LIMIT" - The conversion custom variable has exceeded the
	// segmentation limits, and is approaching the stats limits (> 90%).
	// Segmentation will be disabled, but stats can accrue for new values if the
	// variable is enabled.
	//   "EXCEEDS_STATS_LIMIT" - The conversion custom variable has exceeded both
	// the segmentation limits and stats limits. Segmentation will be disabled, and
	// stats for enabled variables can accrue only if the existing values do not
	// increase the cardinality of the variable any further.
	Cardinality string `json:"cardinality,omitempty"`
	// CustomColumnIds: Output only. The IDs of custom columns that use this
	// conversion custom variable.
	CustomColumnIds googleapi.Int64s `json:"customColumnIds,omitempty"`
	// Family: Output only. Family of the conversion custom variable.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "STANDARD" - The standard conversion custom variable. Customers are
	// required to activate before use.
	//   "FLOODLIGHT" - The conversion custom variable imported from a custom
	// floodlight variable.
	Family string `json:"family,omitempty"`
	// FloodlightConversionCustomVariableInfo: Output only. Fields for Search Ads
	// 360 floodlight conversion custom variables.
	FloodlightConversionCustomVariableInfo *GoogleAdsSearchads360V0ResourcesConversionCustomVariableFloodlightConversionCustomVariableInfo `json:"floodlightConversionCustomVariableInfo,omitempty"`
	// Id: Output only. The ID of the conversion custom variable.
	Id int64 `json:"id,omitempty,string"`
	// Name: Required. The name of the conversion custom variable. Name should be
	// unique. The maximum length of name is 100 characters. There should not be
	// any extra spaces before and after.
	Name string `json:"name,omitempty"`
	// OwnerCustomer: Output only. The resource name of the customer that owns the
	// conversion custom variable.
	OwnerCustomer string `json:"ownerCustomer,omitempty"`
	// ResourceName: Immutable. The resource name of the conversion custom
	// variable. Conversion custom variable resource names have the form:
	// `customers/{customer_id}/conversionCustomVariables/{conversion_custom_variabl
	// e_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: The status of the conversion custom variable for conversion event
	// accrual.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ACTIVATION_NEEDED" - The conversion custom variable is pending activation
	// and will not accrue stats until set to ENABLED. This status can't be used in
	// CREATE and UPDATE requests.
	//   "ENABLED" - The conversion custom variable is enabled and will accrue
	// stats.
	//   "PAUSED" - The conversion custom variable is paused and will not accrue
	// stats until set to ENABLED again.
	Status string `json:"status,omitempty"`
	// Tag: Required. Immutable. The tag of the conversion custom variable. Tag
	// should be unique and consist of a "u" character directly followed with a
	// number less than ormequal to 100. For example: "u4".
	Tag string `json:"tag,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Cardinality") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Cardinality") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__ConversionCustomVariable) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__ConversionCustomVariable
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__ConversionTrackingSetting: A collection of
// customer-wide settings related to Search Ads 360 Conversion Tracking.
type GoogleAdsSearchads360V0Resources__ConversionTrackingSetting struct {
	// AcceptedCustomerDataTerms: Output only. Whether the customer has accepted
	// customer data terms. If using cross-account conversion tracking, this value
	// is inherited from the manager. This field is read-only. For more
	// information, see https://support.google.com/adspolicy/answer/7475709.
	AcceptedCustomerDataTerms bool `json:"acceptedCustomerDataTerms,omitempty"`
	// ConversionTrackingId: Output only. The conversion tracking id used for this
	// account. This id doesn't indicate whether the customer uses conversion
	// tracking (conversion_tracking_status does). This field is read-only.
	ConversionTrackingId int64 `json:"conversionTrackingId,omitempty,string"`
	// ConversionTrackingStatus: Output only. Conversion tracking status. It
	// indicates whether the customer is using conversion tracking, and who is the
	// conversion tracking owner of this customer. If this customer is using
	// cross-account conversion tracking, the value returned will differ based on
	// the `login-customer-id` of the request.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "NOT_CONVERSION_TRACKED" - Customer does not use any conversion tracking.
	//   "CONVERSION_TRACKING_MANAGED_BY_SELF" - The conversion actions are created
	// and managed by this customer.
	//   "CONVERSION_TRACKING_MANAGED_BY_THIS_MANAGER" - The conversion actions are
	// created and managed by the manager specified in the request's
	// `login-customer-id`.
	//   "CONVERSION_TRACKING_MANAGED_BY_ANOTHER_MANAGER" - The conversion actions
	// are created and managed by a manager different from the customer or manager
	// specified in the request's `login-customer-id`.
	ConversionTrackingStatus string `json:"conversionTrackingStatus,omitempty"`
	// CrossAccountConversionTrackingId: Output only. 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.
	CrossAccountConversionTrackingId int64 `json:"crossAccountConversionTrackingId,omitempty,string"`
	// EnhancedConversionsForLeadsEnabled: Output only. Whether the customer is
	// opted-in for enhanced conversions for leads. If using cross-account
	// conversion tracking, this value is inherited from the manager. This field is
	// read-only.
	EnhancedConversionsForLeadsEnabled bool `json:"enhancedConversionsForLeadsEnabled,omitempty"`
	// GoogleAdsConversionCustomer: Output only. The resource name of the customer
	// where conversions are created and managed. This field is read-only.
	GoogleAdsConversionCustomer string `json:"googleAdsConversionCustomer,omitempty"`
	// GoogleAdsCrossAccountConversionTrackingId: Output only. The conversion
	// tracking id of the customer's manager. This is set when the customer is
	// opted into conversion tracking, and it overrides conversion_tracking_id.
	// This field can only be managed through the Google Ads UI. This field is
	// read-only.
	GoogleAdsCrossAccountConversionTrackingId int64 `json:"googleAdsCrossAccountConversionTrackingId,omitempty,string"`
	// ForceSendFields is a list of field names (e.g. "AcceptedCustomerDataTerms")
	// to unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AcceptedCustomerDataTerms") to
	// include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__ConversionTrackingSetting) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__ConversionTrackingSetting
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__CustomColumn: A custom column. See Search
// Ads 360 custom column at https://support.google.com/sa360/answer/9633916
type GoogleAdsSearchads360V0Resources__CustomColumn struct {
	// Description: Output only. User-defined description of the custom column.
	Description string `json:"description,omitempty"`
	// Id: Output only. ID of the custom column.
	Id int64 `json:"id,omitempty,string"`
	// Name: Output only. User-defined name of the custom column.
	Name string `json:"name,omitempty"`
	// Queryable: Output only. True when the custom column is available to be used
	// in the query of SearchAds360Service.Search and
	// SearchAds360Service.SearchStream.
	Queryable bool `json:"queryable,omitempty"`
	// ReferencedSystemColumns: Output only. The list of the referenced system
	// columns of this custom column. For example, A custom column "sum of
	// impressions and clicks" has referenced system columns of {"metrics.clicks",
	// "metrics.impressions"}.
	ReferencedSystemColumns []string `json:"referencedSystemColumns,omitempty"`
	// ReferencesAttributes: Output only. True when the custom column is referring
	// to one or more attributes.
	ReferencesAttributes bool `json:"referencesAttributes,omitempty"`
	// ReferencesMetrics: Output only. True when the custom column is referring to
	// one or more metrics.
	ReferencesMetrics bool `json:"referencesMetrics,omitempty"`
	// ResourceName: Immutable. The resource name of the custom column. Custom
	// column resource names have the form:
	// `customers/{customer_id}/customColumns/{custom_column_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// ValueType: Output only. The type of the result value of the custom column.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Unknown.
	//   "STRING" - The custom column value is a string.
	//   "INT64" - The custom column value is an int64 number.
	//   "DOUBLE" - The custom column value is a double number.
	//   "BOOLEAN" - The custom column value is a boolean.
	ValueType string `json:"valueType,omitempty"`

	// ServerResponse contains the HTTP response code and headers from the server.
	googleapi.ServerResponse `json:"-"`
	// ForceSendFields is a list of field names (e.g. "Description") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Description") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CustomColumn) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CustomColumn
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__Customer: A customer.
type GoogleAdsSearchads360V0Resources__Customer struct {
	// AccountStatus: Output only. Account status, for example, Enabled, Paused,
	// Removed, etc.
	//
	// Possible values:
	//   "UNSPECIFIED" - Default value.
	//   "UNKNOWN" - Unknown value.
	//   "ENABLED" - Account is able to serve ads.
	//   "PAUSED" - Account is deactivated by the user.
	//   "SUSPENDED" - Account is deactivated by an internal process.
	//   "REMOVED" - Account is irrevocably deactivated.
	//   "DRAFT" - Account is still in the process of setup, not ENABLED yet.
	AccountStatus string `json:"accountStatus,omitempty"`
	// AccountType: Output only. Engine account type, for example, Google Ads,
	// Microsoft Advertising, Yahoo Japan, Baidu, Facebook, Engine Track, etc.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "BAIDU" - Baidu account.
	//   "ENGINE_TRACK" - Engine track account.
	//   "FACEBOOK" - Facebook account.
	//   "FACEBOOK_GATEWAY" - Facebook account managed through gateway.
	//   "GOOGLE_ADS" - Google Ads account.
	//   "MICROSOFT" - Microsoft Advertising account.
	//   "SEARCH_ADS_360" - Search Ads 360 manager account.
	//   "YAHOO_JAPAN" - Yahoo Japan account.
	AccountType string `json:"accountType,omitempty"`
	// AutoTaggingEnabled: Whether auto-tagging is enabled for the customer.
	AutoTaggingEnabled bool `json:"autoTaggingEnabled,omitempty"`
	// ConversionTrackingSetting: Output only. Conversion tracking setting for a
	// customer.
	ConversionTrackingSetting *GoogleAdsSearchads360V0Resources__ConversionTrackingSetting `json:"conversionTrackingSetting,omitempty"`
	// CreationTime: Output only. The timestamp when this customer was created. The
	// timestamp is in the customer's time zone and in "yyyy-MM-dd HH:mm:ss"
	// format.
	CreationTime string `json:"creationTime,omitempty"`
	// CurrencyCode: Immutable. The currency in which the account operates. A
	// subset of the currency codes from the ISO 4217 standard is supported.
	CurrencyCode string `json:"currencyCode,omitempty"`
	// DescriptiveName: Optional, non-unique descriptive name of the customer.
	DescriptiveName string `json:"descriptiveName,omitempty"`
	// DoubleClickCampaignManagerSetting: Output only. DoubleClick Campaign Manager
	// (DCM) setting for a manager customer.
	DoubleClickCampaignManagerSetting *GoogleAdsSearchads360V0Resources__DoubleClickCampaignManagerSetting `json:"doubleClickCampaignManagerSetting,omitempty"`
	// EngineId: Output only. ID of the account in the external engine account.
	EngineId string `json:"engineId,omitempty"`
	// FinalUrlSuffix: The URL template for appending params to the final URL.
	FinalUrlSuffix string `json:"finalUrlSuffix,omitempty"`
	// Id: Output only. The ID of the customer.
	Id int64 `json:"id,omitempty,string"`
	// LastModifiedTime: Output only. The datetime when this customer was last
	// modified. The datetime is in the customer's time zone and in "yyyy-MM-dd
	// HH:mm:ss.ssssss" format.
	LastModifiedTime string `json:"lastModifiedTime,omitempty"`
	// Manager: Output only. Whether the customer is a manager.
	Manager bool `json:"manager,omitempty"`
	// ResourceName: Immutable. The resource name of the customer. Customer
	// resource names have the form: `customers/{customer_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. The status of the customer.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ENABLED" - Indicates an active account able to serve ads.
	//   "CANCELED" - Indicates a canceled account unable to serve ads. Can be
	// reactivated by an admin user.
	//   "SUSPENDED" - Indicates a suspended account unable to serve ads. May only
	// be activated by Google support.
	//   "CLOSED" - Indicates a closed account unable to serve ads. Test account
	// will also have CLOSED status. Status is permanent and may not be reopened.
	Status string `json:"status,omitempty"`
	// TimeZone: Immutable. The local timezone ID of the customer.
	TimeZone string `json:"timeZone,omitempty"`
	// TrackingUrlTemplate: The URL template for constructing a tracking URL out of
	// parameters.
	TrackingUrlTemplate string `json:"trackingUrlTemplate,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AccountStatus") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AccountStatus") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__Customer) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__Customer
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__CustomerAsset: A link between a customer
// and an asset.
type GoogleAdsSearchads360V0Resources__CustomerAsset struct {
	// Asset: Required. Immutable. The asset which is linked to the customer.
	Asset string `json:"asset,omitempty"`
	// ResourceName: Immutable. The resource name of the customer asset.
	// CustomerAsset resource names have the form:
	// `customers/{customer_id}/customerAssets/{asset_id}~{field_type}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Status of the customer asset.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ENABLED" - Asset link is enabled.
	//   "REMOVED" - Asset link has been removed.
	//   "PAUSED" - Asset link is paused.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Asset") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Asset") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CustomerAsset) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CustomerAsset
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__CustomerAssetSet: CustomerAssetSet is the
// linkage between a customer and an asset set. Adding a CustomerAssetSet links
// an asset set with a customer.
type GoogleAdsSearchads360V0Resources__CustomerAssetSet struct {
	// AssetSet: Immutable. The asset set which is linked to the customer.
	AssetSet string `json:"assetSet,omitempty"`
	// Customer: Immutable. The customer to which this asset set is linked.
	Customer string `json:"customer,omitempty"`
	// ResourceName: Immutable. The resource name of the customer asset set. Asset
	// set asset resource names have the form:
	// `customers/{customer_id}/customerAssetSets/{asset_set_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. The status of the customer asset set asset. Read-only.
	//
	// Possible values:
	//   "UNSPECIFIED" - The status has not been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "ENABLED" - The linkage between asset set and its container is enabled.
	//   "REMOVED" - The linkage between asset set and its container is removed.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AssetSet") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AssetSet") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CustomerAssetSet) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CustomerAssetSet
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__CustomerClient: 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 GoogleAdsSearchads360V0Resources__CustomerClient struct {
	// AppliedLabels: Output only. The resource names of the labels owned by the
	// requesting customer that are applied to the client customer. Label resource
	// names have the form: `customers/{customer_id}/labels/{label_id}`
	AppliedLabels []string `json:"appliedLabels,omitempty"`
	// ClientCustomer: Output only. The resource name of the client-customer which
	// is linked to the given customer. Read only.
	ClientCustomer string `json:"clientCustomer,omitempty"`
	// CurrencyCode: Output only. Currency code (for example, 'USD', 'EUR') for the
	// client. Read only.
	CurrencyCode string `json:"currencyCode,omitempty"`
	// DescriptiveName: Output only. Descriptive name for the client. Read only.
	DescriptiveName string `json:"descriptiveName,omitempty"`
	// Hidden: Output only. Specifies whether this is a hidden account. Read only.
	Hidden bool `json:"hidden,omitempty"`
	// Id: Output only. The ID of the client customer. Read only.
	Id int64 `json:"id,omitempty,string"`
	// Level: Output only. Distance between given customer and client. For self
	// link, the level value will be 0. Read only.
	Level int64 `json:"level,omitempty,string"`
	// Manager: Output only. Identifies if the client is a manager. Read only.
	Manager bool `json:"manager,omitempty"`
	// ResourceName: Output only. The resource name of the customer client.
	// CustomerClient resource names have the form:
	// `customers/{customer_id}/customerClients/{client_customer_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. The status of the client customer. Read only.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ENABLED" - Indicates an active account able to serve ads.
	//   "CANCELED" - Indicates a canceled account unable to serve ads. Can be
	// reactivated by an admin user.
	//   "SUSPENDED" - Indicates a suspended account unable to serve ads. May only
	// be activated by Google support.
	//   "CLOSED" - Indicates a closed account unable to serve ads. Test account
	// will also have CLOSED status. Status is permanent and may not be reopened.
	Status string `json:"status,omitempty"`
	// TestAccount: Output only. Identifies if the client is a test account. Read
	// only.
	TestAccount bool `json:"testAccount,omitempty"`
	// TimeZone: Output only. Common Locale Data Repository (CLDR) string
	// representation of the time zone of the client, for example,
	// America/Los_Angeles. Read only.
	TimeZone string `json:"timeZone,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AppliedLabels") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AppliedLabels") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CustomerClient) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CustomerClient
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__CustomerManagerLink: Represents
// customer-manager link relationship.
type GoogleAdsSearchads360V0Resources__CustomerManagerLink struct {
	// ManagerCustomer: Output only. The manager customer linked to the customer.
	ManagerCustomer string `json:"managerCustomer,omitempty"`
	// ManagerLinkId: Output only. ID of the customer-manager link. This field is
	// read only.
	ManagerLinkId int64 `json:"managerLinkId,omitempty,string"`
	// ResourceName: Immutable. Name of the resource. CustomerManagerLink resource
	// names have the form:
	// `customers/{customer_id}/customerManagerLinks/{manager_customer_id}~{manager_
	// link_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Status of the link between the customer and the manager.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ACTIVE" - Indicates current in-effect relationship
	//   "INACTIVE" - Indicates terminated relationship
	//   "PENDING" - Indicates relationship has been requested by manager, but the
	// client hasn't accepted yet.
	//   "REFUSED" - Relationship was requested by the manager, but the client has
	// refused.
	//   "CANCELED" - Indicates relationship has been requested by manager, but
	// manager canceled it.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ManagerCustomer") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ManagerCustomer") to include in
	// API requests with the JSON null value. By default, fields with empty values
	// are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__CustomerManagerLink) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__CustomerManagerLink
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__DoubleClickCampaignManagerSetting:
// DoubleClick Campaign Manager (DCM) setting for a manager customer.
type GoogleAdsSearchads360V0Resources__DoubleClickCampaignManagerSetting struct {
	// AdvertiserId: Output only. ID of the Campaign Manager advertiser associated
	// with this customer.
	AdvertiserId int64 `json:"advertiserId,omitempty,string"`
	// NetworkId: Output only. ID of the Campaign Manager network associated with
	// this customer.
	NetworkId int64 `json:"networkId,omitempty,string"`
	// TimeZone: Output only. Time zone of the Campaign Manager network associated
	// with this customer in IANA Time Zone Database format, such as
	// America/New_York.
	TimeZone string `json:"timeZone,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdvertiserId") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdvertiserId") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__DoubleClickCampaignManagerSetting) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__DoubleClickCampaignManagerSetting
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__DynamicSearchAdsSearchTermView: A dynamic
// search ads search term view.
type GoogleAdsSearchads360V0Resources__DynamicSearchAdsSearchTermView struct {
	// LandingPage: Output only. The dynamically selected landing page URL of the
	// impression. This field is read-only.
	LandingPage string `json:"landingPage,omitempty"`
	// ResourceName: Output only. 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}~{searc
	// h_term_fingerprint}~{headline_fingerprint}~{landing_page_fingerprint}~{page_u
	// rl_fingerprint}`
	ResourceName string `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "LandingPage") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "LandingPage") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__DynamicSearchAdsSearchTermView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__DynamicSearchAdsSearchTermView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__GenderView: A gender view. The gender_view
// resource reflects the effective serving state, rather than what criteria
// were added. An ad group without gender criteria by default shows to all
// genders, so all genders appear in gender_view with stats.
type GoogleAdsSearchads360V0Resources__GenderView struct {
	// ResourceName: Output only. 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 `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ResourceName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ResourceName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__GenderView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__GenderView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__GeoTargetConstant: A geo target constant.
type GoogleAdsSearchads360V0Resources__GeoTargetConstant struct {
	// CanonicalName: Output only. The fully qualified English name, consisting of
	// the target's name and that of its parent and country.
	CanonicalName string `json:"canonicalName,omitempty"`
	// CountryCode: Output only. The ISO-3166-1 alpha-2 country code that is
	// associated with the target.
	CountryCode string `json:"countryCode,omitempty"`
	// Id: Output only. The ID of the geo target constant.
	Id int64 `json:"id,omitempty,string"`
	// Name: Output only. Geo target constant English name.
	Name string `json:"name,omitempty"`
	// ParentGeoTarget: Output only. The resource name of the parent geo target
	// constant. Geo target constant resource names have the form:
	// `geoTargetConstants/{parent_geo_target_constant_id}`
	ParentGeoTarget string `json:"parentGeoTarget,omitempty"`
	// ResourceName: Output only. The resource name of the geo target constant. Geo
	// target constant resource names have the form:
	// `geoTargetConstants/{geo_target_constant_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. Geo target constant status.
	//
	// Possible values:
	//   "UNSPECIFIED" - No value has been specified.
	//   "UNKNOWN" - The received value is not known in this version. This is a
	// response-only value.
	//   "ENABLED" - The geo target constant is valid.
	//   "REMOVAL_PLANNED" - The geo target constant is obsolete and will be
	// removed.
	Status string `json:"status,omitempty"`
	// TargetType: Output only. Geo target constant target type.
	TargetType string `json:"targetType,omitempty"`
	// ForceSendFields is a list of field names (e.g. "CanonicalName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CanonicalName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__GeoTargetConstant) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__GeoTargetConstant
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__KeywordView: A keyword view.
type GoogleAdsSearchads360V0Resources__KeywordView struct {
	// ResourceName: Output only. 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 `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ResourceName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ResourceName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__KeywordView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__KeywordView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__Label: A label.
type GoogleAdsSearchads360V0Resources__Label struct {
	// Id: Output only. ID of the label. Read only.
	Id int64 `json:"id,omitempty,string"`
	// Name: 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 string `json:"name,omitempty"`
	// ResourceName: Immutable. Name of the resource. Label resource names have the
	// form: `customers/{customer_id}/labels/{label_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. Status of the label. Read only.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ENABLED" - Label is enabled.
	//   "REMOVED" - Label is removed.
	Status string `json:"status,omitempty"`
	// TextLabel: A type of label displaying text on a colored background.
	TextLabel *GoogleAdsSearchads360V0Common__TextLabel `json:"textLabel,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Id") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Id") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__Label) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__Label
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__LanguageConstant: A language.
type GoogleAdsSearchads360V0Resources__LanguageConstant struct {
	// Code: Output only. The language code, for example, "en_US", "en_AU", "es",
	// "fr", etc.
	Code string `json:"code,omitempty"`
	// Id: Output only. The ID of the language constant.
	Id int64 `json:"id,omitempty,string"`
	// Name: Output only. The full name of the language in English, for example,
	// "English (US)", "Spanish", etc.
	Name string `json:"name,omitempty"`
	// ResourceName: Output only. The resource name of the language constant.
	// Language constant resource names have the form:
	// `languageConstants/{criterion_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Targetable: Output only. Whether the language is targetable.
	Targetable bool `json:"targetable,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Code") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Code") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__LanguageConstant) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__LanguageConstant
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__ListingGroupFilterDimension: Listing
// dimensions for the asset group listing group filter.
type GoogleAdsSearchads360V0Resources__ListingGroupFilterDimension struct {
	// ProductBiddingCategory: Bidding category of a product offer.
	ProductBiddingCategory *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductBiddingCategory `json:"productBiddingCategory,omitempty"`
	// ProductBrand: Brand of a product offer.
	ProductBrand *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductBrand `json:"productBrand,omitempty"`
	// ProductChannel: Locality of a product offer.
	ProductChannel *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductChannel `json:"productChannel,omitempty"`
	// ProductCondition: Condition of a product offer.
	ProductCondition *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductCondition `json:"productCondition,omitempty"`
	// ProductCustomAttribute: Custom attribute of a product offer.
	ProductCustomAttribute *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductCustomAttribute `json:"productCustomAttribute,omitempty"`
	// ProductItemId: Item id of a product offer.
	ProductItemId *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductItemId `json:"productItemId,omitempty"`
	// ProductType: Type of a product offer.
	ProductType *GoogleAdsSearchads360V0ResourcesListingGroupFilterDimensionProductType `json:"productType,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ProductBiddingCategory") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ProductBiddingCategory") to
	// include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__ListingGroupFilterDimension) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__ListingGroupFilterDimension
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__ListingGroupFilterDimensionPath: The path
// defining of dimensions defining a listing group filter.
type GoogleAdsSearchads360V0Resources__ListingGroupFilterDimensionPath struct {
	// Dimensions: Output only. The complete path of dimensions through the listing
	// group filter hierarchy (excluding the root node) to this listing group
	// filter.
	Dimensions []*GoogleAdsSearchads360V0Resources__ListingGroupFilterDimension `json:"dimensions,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Dimensions") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Dimensions") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__ListingGroupFilterDimensionPath) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__ListingGroupFilterDimensionPath
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__LocationView: A location view summarizes
// the performance of campaigns by a Location criterion.
type GoogleAdsSearchads360V0Resources__LocationView struct {
	// ResourceName: Output only. The resource name of the location view. Location
	// view resource names have the form:
	// `customers/{customer_id}/locationViews/{campaign_id}~{criterion_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ResourceName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ResourceName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__LocationView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__LocationView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__ProductBiddingCategoryConstant: A Product
// Bidding Category.
type GoogleAdsSearchads360V0Resources__ProductBiddingCategoryConstant struct {
	// CountryCode: Output only. Two-letter upper-case country code of the product
	// bidding category.
	CountryCode string `json:"countryCode,omitempty"`
	// Id: Output only. 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 int64 `json:"id,omitempty,string"`
	// LanguageCode: Output only. Language code of the product bidding category.
	LanguageCode string `json:"languageCode,omitempty"`
	// Level: Output only. Level of the product bidding category.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "LEVEL1" - Level 1.
	//   "LEVEL2" - Level 2.
	//   "LEVEL3" - Level 3.
	//   "LEVEL4" - Level 4.
	//   "LEVEL5" - Level 5.
	Level string `json:"level,omitempty"`
	// LocalizedName: Output only. Display value of the product bidding category
	// localized according to language_code.
	LocalizedName string `json:"localizedName,omitempty"`
	// ProductBiddingCategoryConstantParent: Output only. Resource name of the
	// parent product bidding category.
	ProductBiddingCategoryConstantParent string `json:"productBiddingCategoryConstantParent,omitempty"`
	// ResourceName: Output only. The resource name of the product bidding
	// category. Product bidding category resource names have the form:
	// `productBiddingCategoryConstants/{country_code}~{level}~{id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Status: Output only. Status of the product bidding category.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ACTIVE" - The category is active and can be used for bidding.
	//   "OBSOLETE" - The category is obsolete. Used only for reporting purposes.
	Status string `json:"status,omitempty"`
	// ForceSendFields is a list of field names (e.g. "CountryCode") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CountryCode") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__ProductBiddingCategoryConstant) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__ProductBiddingCategoryConstant
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__ProductGroupView: A product group view.
type GoogleAdsSearchads360V0Resources__ProductGroupView struct {
	// ResourceName: Output only. 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 `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ResourceName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ResourceName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__ProductGroupView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__ProductGroupView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__SearchAds360Field: A field or resource
// (artifact) used by SearchAds360Service.
type GoogleAdsSearchads360V0Resources__SearchAds360Field struct {
	// AttributeResources: Output only. 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 []string `json:"attributeResources,omitempty"`
	// Category: Output only. The category of the artifact.
	//
	// Possible values:
	//   "UNSPECIFIED" - Unspecified
	//   "UNKNOWN" - Unknown
	//   "RESOURCE" - The described artifact is a resource.
	//   "ATTRIBUTE" - 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.
	//   "SEGMENT" - The described artifact is a field and always segments search
	// queries.
	//   "METRIC" - The described artifact is a field and is a metric. It never
	// segments search queries.
	Category string `json:"category,omitempty"`
	// DataType: Output only. This field determines the operators that can be used
	// with the artifact in WHERE clauses.
	//
	// Possible values:
	//   "UNSPECIFIED" - Unspecified
	//   "UNKNOWN" - Unknown
	//   "BOOLEAN" - Maps to google.protobuf.BoolValue Applicable operators: =, !=
	//   "DATE" - Maps to google.protobuf.StringValue. It can be compared using the
	// set of operators specific to dates however. Applicable operators: =, <, >,
	// <=, >=, BETWEEN, DURING, and IN
	//   "DOUBLE" - Maps to google.protobuf.DoubleValue Applicable operators: =,
	// !=, <, >, IN, NOT IN
	//   "ENUM" - Maps to an enum. It's specific definition can be found at
	// type_url. Applicable operators: =, !=, IN, NOT IN
	//   "FLOAT" - Maps to google.protobuf.FloatValue Applicable operators: =, !=,
	// <, >, IN, NOT IN
	//   "INT32" - Maps to google.protobuf.Int32Value Applicable operators: =, !=,
	// <, >, <=, >=, BETWEEN, IN, NOT IN
	//   "INT64" - Maps to google.protobuf.Int64Value Applicable operators: =, !=,
	// <, >, <=, >=, BETWEEN, IN, NOT IN
	//   "MESSAGE" - Maps to a protocol buffer message type. The data type's
	// details can be found in type_url. No operators work with MESSAGE fields.
	//   "RESOURCE_NAME" - 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.
	//   "STRING" - Maps to google.protobuf.StringValue. Applicable operators: =,
	// !=, LIKE, NOT LIKE, IN, NOT IN
	//   "UINT64" - Maps to google.protobuf.UInt64Value Applicable operators: =,
	// !=, <, >, <=, >=, BETWEEN, IN, NOT IN
	DataType string `json:"dataType,omitempty"`
	// EnumValues: Output only. 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 []string `json:"enumValues,omitempty"`
	// Filterable: Output only. Whether the artifact can be used in a WHERE clause
	// in search queries.
	Filterable bool `json:"filterable,omitempty"`
	// IsRepeated: Output only. Whether the field artifact is repeated.
	IsRepeated bool `json:"isRepeated,omitempty"`
	// Metrics: Output only. 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.
	Metrics []string `json:"metrics,omitempty"`
	// Name: Output only. The name of the artifact.
	Name string `json:"name,omitempty"`
	// ResourceName: Output only. The resource name of the artifact. Artifact
	// resource names have the form: `SearchAds360Fields/{name}`
	ResourceName string `json:"resourceName,omitempty"`
	// Segments: Output only. 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.
	Segments []string `json:"segments,omitempty"`
	// Selectable: Output only. Whether the artifact can be used in a SELECT clause
	// in search queries.
	Selectable bool `json:"selectable,omitempty"`
	// SelectableWith: Output only. The names of all resources, segments, and
	// metrics that are selectable with the described artifact.
	SelectableWith []string `json:"selectableWith,omitempty"`
	// Sortable: Output only. Whether the artifact can be used in a ORDER BY clause
	// in search queries.
	Sortable bool `json:"sortable,omitempty"`
	// TypeUrl: Output only. The URL of proto describing the artifact's data type.
	TypeUrl string `json:"typeUrl,omitempty"`

	// ServerResponse contains the HTTP response code and headers from the server.
	googleapi.ServerResponse `json:"-"`
	// ForceSendFields is a list of field names (e.g. "AttributeResources") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AttributeResources") to include
	// in API requests with the JSON null value. By default, fields with empty
	// values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__SearchAds360Field) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__SearchAds360Field
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__ShoppingPerformanceView: 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 GoogleAdsSearchads360V0Resources__ShoppingPerformanceView struct {
	// ResourceName: Output only. The resource name of the Shopping performance
	// view. Shopping performance view resource names have the form:
	// `customers/{customer_id}/shoppingPerformanceView`
	ResourceName string `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ResourceName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ResourceName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__ShoppingPerformanceView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__ShoppingPerformanceView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__UserList: A user list. This is a list of
// users a customer may target.
type GoogleAdsSearchads360V0Resources__UserList struct {
	// Id: Output only. Id of the user list.
	Id int64 `json:"id,omitempty,string"`
	// Name: Name of this user list. Depending on its access_reason, the user list
	// name may not be unique (for example, if access_reason=SHARED)
	Name string `json:"name,omitempty"`
	// ResourceName: Immutable. The resource name of the user list. User list
	// resource names have the form:
	// `customers/{customer_id}/userLists/{user_list_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// Type: Output only. Type of this list. This field is read-only.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "REMARKETING" - UserList represented as a collection of conversion types.
	//   "LOGICAL" - UserList represented as a combination of other user
	// lists/interests.
	//   "EXTERNAL_REMARKETING" - UserList created in the Google Ad Manager
	// platform.
	//   "RULE_BASED" - UserList associated with a rule.
	//   "SIMILAR" - UserList with users similar to users of another UserList.
	//   "CRM_BASED" - UserList of first-party CRM data provided by advertiser in
	// the form of emails or other formats.
	Type string `json:"type,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Id") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Id") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__UserList) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__UserList
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__Visit: A visit.
type GoogleAdsSearchads360V0Resources__Visit struct {
	// AdId: Output only. Ad ID. A value of 0 indicates that the ad is
	// unattributed.
	AdId int64 `json:"adId,omitempty,string"`
	// AssetFieldType: Output only. Asset field type of the visit event.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "HEADLINE" - The asset is linked for use as a headline.
	//   "DESCRIPTION" - The asset is linked for use as a description.
	//   "MANDATORY_AD_TEXT" - The asset is linked for use as mandatory ad text.
	//   "MARKETING_IMAGE" - The asset is linked for use as a marketing image.
	//   "MEDIA_BUNDLE" - The asset is linked for use as a media bundle.
	//   "YOUTUBE_VIDEO" - The asset is linked for use as a YouTube video.
	//   "BOOK_ON_GOOGLE" - The asset is linked to indicate that a hotels campaign
	// is "Book on Google" enabled.
	//   "LEAD_FORM" - The asset is linked for use as a Lead Form extension.
	//   "PROMOTION" - The asset is linked for use as a Promotion extension.
	//   "CALLOUT" - The asset is linked for use as a Callout extension.
	//   "STRUCTURED_SNIPPET" - The asset is linked for use as a Structured Snippet
	// extension.
	//   "SITELINK" - The asset is linked for use as a Sitelink.
	//   "MOBILE_APP" - The asset is linked for use as a Mobile App extension.
	//   "HOTEL_CALLOUT" - The asset is linked for use as a Hotel Callout
	// extension.
	//   "CALL" - The asset is linked for use as a Call extension.
	//   "PRICE" - The asset is linked for use as a Price extension.
	//   "LONG_HEADLINE" - The asset is linked for use as a long headline.
	//   "BUSINESS_NAME" - The asset is linked for use as a business name.
	//   "SQUARE_MARKETING_IMAGE" - The asset is linked for use as a square
	// marketing image.
	//   "PORTRAIT_MARKETING_IMAGE" - The asset is linked for use as a portrait
	// marketing image.
	//   "LOGO" - The asset is linked for use as a logo.
	//   "LANDSCAPE_LOGO" - The asset is linked for use as a landscape logo.
	//   "VIDEO" - The asset is linked for use as a non YouTube logo.
	//   "CALL_TO_ACTION_SELECTION" - The asset is linked for use to select a
	// call-to-action.
	//   "AD_IMAGE" - The asset is linked for use to select an ad image.
	//   "BUSINESS_LOGO" - The asset is linked for use as a business logo.
	//   "HOTEL_PROPERTY" - The asset is linked for use as a hotel property in a
	// Performance Max for travel goals campaign.
	//   "DISCOVERY_CAROUSEL_CARD" - The asset is linked for use as a discovery
	// carousel card.
	AssetFieldType string `json:"assetFieldType,omitempty"`
	// AssetId: Output only. ID of the asset which was interacted with during the
	// visit event.
	AssetId int64 `json:"assetId,omitempty,string"`
	// ClickId: Output only. A unique string for each visit that is passed to the
	// landing page as the click id URL parameter.
	ClickId string `json:"clickId,omitempty"`
	// CriterionId: Output only. Search Ads 360 keyword ID. A value of 0 indicates
	// that the keyword is unattributed.
	CriterionId int64 `json:"criterionId,omitempty,string"`
	// Id: Output only. The ID of the visit.
	Id int64 `json:"id,omitempty,string"`
	// MerchantId: Output only. The Search Ads 360 inventory account ID containing
	// the product that was clicked on. Search Ads 360 generates this ID when you
	// link an inventory account in Search Ads 360.
	MerchantId int64 `json:"merchantId,omitempty,string"`
	// ProductChannel: Output only. The sales channel of the product that was
	// clicked on: Online or Local.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Used for return value only. Represents value unknown in this
	// version.
	//   "ONLINE" - The item is sold online.
	//   "LOCAL" - The item is sold in local stores.
	ProductChannel string `json:"productChannel,omitempty"`
	// ProductCountryCode: Output only. The country (ISO-3166 format) registered
	// for the inventory feed that contains the product clicked on.
	ProductCountryCode string `json:"productCountryCode,omitempty"`
	// ProductId: Output only. The ID of the product clicked on.
	ProductId string `json:"productId,omitempty"`
	// ProductLanguageCode: Output only. The language (ISO-639-1) that has been set
	// for the Merchant Center feed containing data about the product.
	ProductLanguageCode string `json:"productLanguageCode,omitempty"`
	// ProductStoreId: Output only. The store in the Local Inventory Ad that was
	// clicked on. This should match the store IDs used in your local products
	// feed.
	ProductStoreId string `json:"productStoreId,omitempty"`
	// ResourceName: Output only. The resource name of the visit. Visit resource
	// names have the form:
	// `customers/{customer_id}/visits/{ad_group_id}~{criterion_id}~{ds_visit_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// VisitDateTime: Output only. The timestamp of the visit event. The timestamp
	// is in the customer's time zone and in "yyyy-MM-dd HH:mm:ss" format.
	VisitDateTime string `json:"visitDateTime,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AdId") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AdId") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__Visit) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__Visit
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Resources__WebpageView: A webpage view.
type GoogleAdsSearchads360V0Resources__WebpageView struct {
	// ResourceName: Output only. The resource name of the webpage view. Webpage
	// view resource names have the form:
	// `customers/{customer_id}/webpageViews/{ad_group_id}~{criterion_id}`
	ResourceName string `json:"resourceName,omitempty"`
	// ForceSendFields is a list of field names (e.g. "ResourceName") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ResourceName") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Resources__WebpageView) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Resources__WebpageView
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__ConversionCustomDimensionHeader: Message
// for conversion custom dimension header.
type GoogleAdsSearchads360V0Services__ConversionCustomDimensionHeader struct {
	// Id: The conversion custom dimension ID.
	Id int64 `json:"id,omitempty,string"`
	// Name: The user defined name of the conversion custom dimension.
	Name string `json:"name,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Id") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Id") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__ConversionCustomDimensionHeader) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__ConversionCustomDimensionHeader
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__ConversionCustomMetricHeader: Message for
// conversion custom metric header.
type GoogleAdsSearchads360V0Services__ConversionCustomMetricHeader struct {
	// Id: The conversion custom metric ID.
	Id int64 `json:"id,omitempty,string"`
	// Name: The user defined name of the conversion custom metric.
	Name string `json:"name,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Id") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Id") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__ConversionCustomMetricHeader) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__ConversionCustomMetricHeader
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__CustomColumnHeader: Message for custom
// column header.
type GoogleAdsSearchads360V0Services__CustomColumnHeader struct {
	// Id: The custom column ID.
	Id int64 `json:"id,omitempty,string"`
	// Name: The user defined name of the custom column.
	Name string `json:"name,omitempty"`
	// ReferencesMetrics: True when the custom column references metrics.
	ReferencesMetrics bool `json:"referencesMetrics,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Id") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Id") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__CustomColumnHeader) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__CustomColumnHeader
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__ListAccessibleCustomersResponse: Response
// message for CustomerService.ListAccessibleCustomers.
type GoogleAdsSearchads360V0Services__ListAccessibleCustomersResponse struct {
	// ResourceNames: Resource name of customers directly accessible by the user
	// authenticating the call.
	ResourceNames []string `json:"resourceNames,omitempty"`

	// ServerResponse contains the HTTP response code and headers from the server.
	googleapi.ServerResponse `json:"-"`
	// ForceSendFields is a list of field names (e.g. "ResourceNames") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "ResourceNames") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__ListAccessibleCustomersResponse) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__ListAccessibleCustomersResponse
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__ListCustomColumnsResponse: Response message
// for fetching all custom columns associated with a customer.
type GoogleAdsSearchads360V0Services__ListCustomColumnsResponse struct {
	// CustomColumns: The CustomColumns owned by the provided customer.
	CustomColumns []*GoogleAdsSearchads360V0Resources__CustomColumn `json:"customColumns,omitempty"`

	// ServerResponse contains the HTTP response code and headers from the server.
	googleapi.ServerResponse `json:"-"`
	// ForceSendFields is a list of field names (e.g. "CustomColumns") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "CustomColumns") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__ListCustomColumnsResponse) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__ListCustomColumnsResponse
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__RawEventConversionDimensionHeader: Message
// for raw event conversion dimension header.
type GoogleAdsSearchads360V0Services__RawEventConversionDimensionHeader struct {
	// Id: The conversion custom variable ID.
	Id int64 `json:"id,omitempty,string"`
	// Name: The user defined name of the raw event dimension.
	Name string `json:"name,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Id") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Id") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__RawEventConversionDimensionHeader) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__RawEventConversionDimensionHeader
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__RawEventConversionMetricHeader: Message for
// raw event conversion metric header.
type GoogleAdsSearchads360V0Services__RawEventConversionMetricHeader struct {
	// Id: The conversion custom variable ID.
	Id int64 `json:"id,omitempty,string"`
	// Name: The user defined name of the raw event metric.
	Name string `json:"name,omitempty"`
	// ForceSendFields is a list of field names (e.g. "Id") to unconditionally
	// include in API requests. By default, fields with empty or default values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "Id") to include in API requests
	// with the JSON null value. By default, fields with empty values are omitted
	// from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__RawEventConversionMetricHeader) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__RawEventConversionMetricHeader
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__SearchAds360Row: A returned row from the
// query.
type GoogleAdsSearchads360V0Services__SearchAds360Row struct {
	// AccessibleBiddingStrategy: The accessible bidding strategy referenced in the
	// query.
	AccessibleBiddingStrategy *GoogleAdsSearchads360V0Resources__AccessibleBiddingStrategy `json:"accessibleBiddingStrategy,omitempty"`
	// AdGroup: The ad group referenced in the query.
	AdGroup *GoogleAdsSearchads360V0Resources__AdGroup `json:"adGroup,omitempty"`
	// AdGroupAd: The ad referenced in the query.
	AdGroupAd *GoogleAdsSearchads360V0Resources__AdGroupAd `json:"adGroupAd,omitempty"`
	// AdGroupAdLabel: The ad group ad label referenced in the query.
	AdGroupAdLabel *GoogleAdsSearchads360V0Resources__AdGroupAdLabel `json:"adGroupAdLabel,omitempty"`
	// AdGroupAsset: The ad group asset referenced in the query.
	AdGroupAsset *GoogleAdsSearchads360V0Resources__AdGroupAsset `json:"adGroupAsset,omitempty"`
	// AdGroupAssetSet: The ad group asset set referenced in the query.
	AdGroupAssetSet *GoogleAdsSearchads360V0Resources__AdGroupAssetSet `json:"adGroupAssetSet,omitempty"`
	// AdGroupAudienceView: The ad group audience view referenced in the query.
	AdGroupAudienceView *GoogleAdsSearchads360V0Resources__AdGroupAudienceView `json:"adGroupAudienceView,omitempty"`
	// AdGroupBidModifier: The bid modifier referenced in the query.
	AdGroupBidModifier *GoogleAdsSearchads360V0Resources__AdGroupBidModifier `json:"adGroupBidModifier,omitempty"`
	// AdGroupCriterion: The criterion referenced in the query.
	AdGroupCriterion *GoogleAdsSearchads360V0Resources__AdGroupCriterion `json:"adGroupCriterion,omitempty"`
	// AdGroupCriterionLabel: The ad group criterion label referenced in the query.
	AdGroupCriterionLabel *GoogleAdsSearchads360V0Resources__AdGroupCriterionLabel `json:"adGroupCriterionLabel,omitempty"`
	// AdGroupLabel: The ad group label referenced in the query.
	AdGroupLabel *GoogleAdsSearchads360V0Resources__AdGroupLabel `json:"adGroupLabel,omitempty"`
	// AgeRangeView: The age range view referenced in the query.
	AgeRangeView *GoogleAdsSearchads360V0Resources__AgeRangeView `json:"ageRangeView,omitempty"`
	// Asset: The asset referenced in the query.
	Asset *GoogleAdsSearchads360V0Resources__Asset `json:"asset,omitempty"`
	// AssetGroup: The asset group referenced in the query.
	AssetGroup *GoogleAdsSearchads360V0Resources__AssetGroup `json:"assetGroup,omitempty"`
	// AssetGroupAsset: The asset group asset referenced in the query.
	AssetGroupAsset *GoogleAdsSearchads360V0Resources__AssetGroupAsset `json:"assetGroupAsset,omitempty"`
	// AssetGroupListingGroupFilter: The asset group listing group filter
	// referenced in the query.
	AssetGroupListingGroupFilter *GoogleAdsSearchads360V0Resources__AssetGroupListingGroupFilter `json:"assetGroupListingGroupFilter,omitempty"`
	// AssetGroupSignal: The asset group signal referenced in the query.
	AssetGroupSignal *GoogleAdsSearchads360V0Resources__AssetGroupSignal `json:"assetGroupSignal,omitempty"`
	// AssetGroupTopCombinationView: The asset group top combination view
	// referenced in the query.
	AssetGroupTopCombinationView *GoogleAdsSearchads360V0Resources__AssetGroupTopCombinationView `json:"assetGroupTopCombinationView,omitempty"`
	// AssetSet: The asset set referenced in the query.
	AssetSet *GoogleAdsSearchads360V0Resources__AssetSet `json:"assetSet,omitempty"`
	// AssetSetAsset: The asset set asset referenced in the query.
	AssetSetAsset *GoogleAdsSearchads360V0Resources__AssetSetAsset `json:"assetSetAsset,omitempty"`
	// Audience: The Audience referenced in the query.
	Audience *GoogleAdsSearchads360V0Resources__Audience `json:"audience,omitempty"`
	// BiddingStrategy: The bidding strategy referenced in the query.
	BiddingStrategy *GoogleAdsSearchads360V0Resources__BiddingStrategy `json:"biddingStrategy,omitempty"`
	// Campaign: The campaign referenced in the query.
	Campaign *GoogleAdsSearchads360V0Resources__Campaign `json:"campaign,omitempty"`
	// CampaignAsset: The campaign asset referenced in the query.
	CampaignAsset *GoogleAdsSearchads360V0Resources__CampaignAsset `json:"campaignAsset,omitempty"`
	// CampaignAssetSet: The campaign asset set referenced in the query.
	CampaignAssetSet *GoogleAdsSearchads360V0Resources__CampaignAssetSet `json:"campaignAssetSet,omitempty"`
	// CampaignAudienceView: The campaign audience view referenced in the query.
	CampaignAudienceView *GoogleAdsSearchads360V0Resources__CampaignAudienceView `json:"campaignAudienceView,omitempty"`
	// CampaignBudget: The campaign budget referenced in the query.
	CampaignBudget *GoogleAdsSearchads360V0Resources__CampaignBudget `json:"campaignBudget,omitempty"`
	// CampaignCriterion: The campaign criterion referenced in the query.
	CampaignCriterion *GoogleAdsSearchads360V0Resources__CampaignCriterion `json:"campaignCriterion,omitempty"`
	// CampaignLabel: The campaign label referenced in the query.
	CampaignLabel *GoogleAdsSearchads360V0Resources__CampaignLabel `json:"campaignLabel,omitempty"`
	// CartDataSalesView: The cart data sales view referenced in the query.
	CartDataSalesView *GoogleAdsSearchads360V0Resources__CartDataSalesView `json:"cartDataSalesView,omitempty"`
	// Conversion: The event level conversion referenced in the query.
	Conversion *GoogleAdsSearchads360V0Resources__Conversion `json:"conversion,omitempty"`
	// ConversionAction: The conversion action referenced in the query.
	ConversionAction *GoogleAdsSearchads360V0Resources__ConversionAction `json:"conversionAction,omitempty"`
	// ConversionCustomVariable: The conversion custom variable referenced in the
	// query.
	ConversionCustomVariable *GoogleAdsSearchads360V0Resources__ConversionCustomVariable `json:"conversionCustomVariable,omitempty"`
	// CustomColumns: The custom columns.
	CustomColumns []*GoogleAdsSearchads360V0Common__Value `json:"customColumns,omitempty"`
	// Customer: The customer referenced in the query.
	Customer *GoogleAdsSearchads360V0Resources__Customer `json:"customer,omitempty"`
	// CustomerAsset: The customer asset referenced in the query.
	CustomerAsset *GoogleAdsSearchads360V0Resources__CustomerAsset `json:"customerAsset,omitempty"`
	// CustomerAssetSet: The customer asset set referenced in the query.
	CustomerAssetSet *GoogleAdsSearchads360V0Resources__CustomerAssetSet `json:"customerAssetSet,omitempty"`
	// CustomerClient: The CustomerClient referenced in the query.
	CustomerClient *GoogleAdsSearchads360V0Resources__CustomerClient `json:"customerClient,omitempty"`
	// CustomerManagerLink: The CustomerManagerLink referenced in the query.
	CustomerManagerLink *GoogleAdsSearchads360V0Resources__CustomerManagerLink `json:"customerManagerLink,omitempty"`
	// DynamicSearchAdsSearchTermView: The dynamic search ads search term view
	// referenced in the query.
	DynamicSearchAdsSearchTermView *GoogleAdsSearchads360V0Resources__DynamicSearchAdsSearchTermView `json:"dynamicSearchAdsSearchTermView,omitempty"`
	// GenderView: The gender view referenced in the query.
	GenderView *GoogleAdsSearchads360V0Resources__GenderView `json:"genderView,omitempty"`
	// GeoTargetConstant: The geo target constant referenced in the query.
	GeoTargetConstant *GoogleAdsSearchads360V0Resources__GeoTargetConstant `json:"geoTargetConstant,omitempty"`
	// KeywordView: The keyword view referenced in the query.
	KeywordView *GoogleAdsSearchads360V0Resources__KeywordView `json:"keywordView,omitempty"`
	// Label: The label referenced in the query.
	Label *GoogleAdsSearchads360V0Resources__Label `json:"label,omitempty"`
	// LanguageConstant: The language constant referenced in the query.
	LanguageConstant *GoogleAdsSearchads360V0Resources__LanguageConstant `json:"languageConstant,omitempty"`
	// LocationView: The location view referenced in the query.
	LocationView *GoogleAdsSearchads360V0Resources__LocationView `json:"locationView,omitempty"`
	// Metrics: The metrics.
	Metrics *GoogleAdsSearchads360V0Common__Metrics `json:"metrics,omitempty"`
	// ProductBiddingCategoryConstant: The Product Bidding Category referenced in
	// the query.
	ProductBiddingCategoryConstant *GoogleAdsSearchads360V0Resources__ProductBiddingCategoryConstant `json:"productBiddingCategoryConstant,omitempty"`
	// ProductGroupView: The product group view referenced in the query.
	ProductGroupView *GoogleAdsSearchads360V0Resources__ProductGroupView `json:"productGroupView,omitempty"`
	// Segments: The segments.
	Segments *GoogleAdsSearchads360V0Common__Segments `json:"segments,omitempty"`
	// ShoppingPerformanceView: The shopping performance view referenced in the
	// query.
	ShoppingPerformanceView *GoogleAdsSearchads360V0Resources__ShoppingPerformanceView `json:"shoppingPerformanceView,omitempty"`
	// UserList: The user list referenced in the query.
	UserList *GoogleAdsSearchads360V0Resources__UserList `json:"userList,omitempty"`
	// Visit: The event level visit referenced in the query.
	Visit *GoogleAdsSearchads360V0Resources__Visit `json:"visit,omitempty"`
	// WebpageView: The webpage view referenced in the query.
	WebpageView *GoogleAdsSearchads360V0Resources__WebpageView `json:"webpageView,omitempty"`
	// ForceSendFields is a list of field names (e.g. "AccessibleBiddingStrategy")
	// to unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "AccessibleBiddingStrategy") to
	// include in API requests with the JSON null value. By default, fields with
	// empty values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__SearchAds360Row) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__SearchAds360Row
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsRequest: Request
// message for SearchAds360FieldService.SearchSearchAds360Fields.
type GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsRequest struct {
	// PageSize: 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 int64 `json:"pageSize,omitempty"`
	// PageToken: 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 `json:"pageToken,omitempty"`
	// Query: Required. The query string.
	Query string `json:"query,omitempty"`
	// ForceSendFields is a list of field names (e.g. "PageSize") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "PageSize") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsRequest) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsRequest
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsResponse: Response
// message for SearchAds360FieldService.SearchSearchAds360Fields.
type GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsResponse struct {
	// NextPageToken: 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 `json:"nextPageToken,omitempty"`
	// Results: The list of fields that matched the query.
	Results []*GoogleAdsSearchads360V0Resources__SearchAds360Field `json:"results,omitempty"`
	// TotalResultsCount: Total number of results that match the query ignoring the
	// LIMIT clause.
	TotalResultsCount int64 `json:"totalResultsCount,omitempty,string"`

	// ServerResponse contains the HTTP response code and headers from the server.
	googleapi.ServerResponse `json:"-"`
	// ForceSendFields is a list of field names (e.g. "NextPageToken") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "NextPageToken") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsResponse) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsResponse
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__SearchSearchAds360Request: Request message
// for SearchAds360Service.Search.
type GoogleAdsSearchads360V0Services__SearchSearchAds360Request struct {
	// PageSize: 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 int64 `json:"pageSize,omitempty"`
	// PageToken: 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 `json:"pageToken,omitempty"`
	// Query: Required. The query string.
	Query string `json:"query,omitempty"`
	// ReturnTotalResultsCount: 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 `json:"returnTotalResultsCount,omitempty"`
	// SummaryRowSetting: 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.
	//
	// Possible values:
	//   "UNSPECIFIED" - Not specified.
	//   "UNKNOWN" - Represent unknown values of return summary row.
	//   "NO_SUMMARY_ROW" - Do not return summary row.
	//   "SUMMARY_ROW_WITH_RESULTS" - Return summary row along with results. The
	// summary row will be returned in the last batch alone (last batch will
	// contain no results).
	//   "SUMMARY_ROW_ONLY" - Return summary row only and return no results.
	SummaryRowSetting string `json:"summaryRowSetting,omitempty"`
	// ValidateOnly: If true, the request is validated but not executed.
	ValidateOnly bool `json:"validateOnly,omitempty"`
	// ForceSendFields is a list of field names (e.g. "PageSize") to
	// unconditionally include in API requests. By default, fields with empty or
	// default values are omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g. "PageSize") to include in API
	// requests with the JSON null value. By default, fields with empty values are
	// omitted from API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-NullFields for more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__SearchSearchAds360Request) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__SearchSearchAds360Request
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

// GoogleAdsSearchads360V0Services__SearchSearchAds360Response: Response
// message for SearchAds360Service.Search.
type GoogleAdsSearchads360V0Services__SearchSearchAds360Response struct {
	// ConversionCustomDimensionHeaders: The headers of the conversion custom
	// dimensions in the results.
	ConversionCustomDimensionHeaders []*GoogleAdsSearchads360V0Services__ConversionCustomDimensionHeader `json:"conversionCustomDimensionHeaders,omitempty"`
	// ConversionCustomMetricHeaders: The headers of the conversion custom metrics
	// in the results.
	ConversionCustomMetricHeaders []*GoogleAdsSearchads360V0Services__ConversionCustomMetricHeader `json:"conversionCustomMetricHeaders,omitempty"`
	// CustomColumnHeaders: The headers of the custom columns in the results.
	CustomColumnHeaders []*GoogleAdsSearchads360V0Services__CustomColumnHeader `json:"customColumnHeaders,omitempty"`
	// FieldMask: FieldMask that represents what fields were requested by the user.
	FieldMask string `json:"fieldMask,omitempty"`
	// NextPageToken: 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 `json:"nextPageToken,omitempty"`
	// RawEventConversionDimensionHeaders: The headers of the raw event conversion
	// dimensions in the results.
	RawEventConversionDimensionHeaders []*GoogleAdsSearchads360V0Services__RawEventConversionDimensionHeader `json:"rawEventConversionDimensionHeaders,omitempty"`
	// RawEventConversionMetricHeaders: The headers of the raw event conversion
	// metrics in the results.
	RawEventConversionMetricHeaders []*GoogleAdsSearchads360V0Services__RawEventConversionMetricHeader `json:"rawEventConversionMetricHeaders,omitempty"`
	// Results: The list of rows that matched the query.
	Results []*GoogleAdsSearchads360V0Services__SearchAds360Row `json:"results,omitempty"`
	// SummaryRow: 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 *GoogleAdsSearchads360V0Services__SearchAds360Row `json:"summaryRow,omitempty"`
	// TotalResultsCount: Total number of results that match the query ignoring the
	// LIMIT clause.
	TotalResultsCount int64 `json:"totalResultsCount,omitempty,string"`

	// ServerResponse contains the HTTP response code and headers from the server.
	googleapi.ServerResponse `json:"-"`
	// ForceSendFields is a list of field names (e.g.
	// "ConversionCustomDimensionHeaders") to unconditionally include in API
	// requests. By default, fields with empty or default values are omitted from
	// API requests. See
	// https://pkg.go.dev/google.golang.org/api#hdr-ForceSendFields for more
	// details.
	ForceSendFields []string `json:"-"`
	// NullFields is a list of field names (e.g.
	// "ConversionCustomDimensionHeaders") to include in API requests with the JSON
	// null value. By default, fields with empty values are omitted from API
	// requests. See https://pkg.go.dev/google.golang.org/api#hdr-NullFields for
	// more details.
	NullFields []string `json:"-"`
}

func (s *GoogleAdsSearchads360V0Services__SearchSearchAds360Response) MarshalJSON() ([]byte, error) {
	type NoMethod GoogleAdsSearchads360V0Services__SearchSearchAds360Response
	return gensupport.MarshalJSON(NoMethod(*s), s.ForceSendFields, s.NullFields)
}

type CustomersListAccessibleCustomersCall struct {
	s            *Service
	urlParams_   gensupport.URLParams
	ifNoneMatch_ string
	ctx_         context.Context
	header_      http.Header
}

// ListAccessibleCustomers: Returns resource names of customers directly
// accessible by the user authenticating the call. List of thrown errors:
// AuthenticationError () [AuthorizationError]() HeaderError ()
// [InternalError]() QuotaError () [RequestError]()
func (r *CustomersService) ListAccessibleCustomers() *CustomersListAccessibleCustomersCall {
	c := &CustomersListAccessibleCustomersCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse for more
// details.
func (c *CustomersListAccessibleCustomersCall) Fields(s ...googleapi.Field) *CustomersListAccessibleCustomersCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// IfNoneMatch sets an optional parameter which makes the operation fail if the
// object's ETag matches the given value. This is useful for getting updates
// only after the object has changed since the last request.
func (c *CustomersListAccessibleCustomersCall) IfNoneMatch(entityTag string) *CustomersListAccessibleCustomersCall {
	c.ifNoneMatch_ = entityTag
	return c
}

// Context sets the context to be used in this call's Do method.
func (c *CustomersListAccessibleCustomersCall) Context(ctx context.Context) *CustomersListAccessibleCustomersCall {
	c.ctx_ = ctx
	return c
}

// Header returns a http.Header that can be modified by the caller to add
// headers to the request.
func (c *CustomersListAccessibleCustomersCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *CustomersListAccessibleCustomersCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_)
	if c.ifNoneMatch_ != "" {
		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
	}
	var body io.Reader = nil
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "v0/customers:listAccessibleCustomers")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("GET", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "searchads360.customers.listAccessibleCustomers" call.
// Any non-2xx status code is an error. Response headers are in either
// *GoogleAdsSearchads360V0Services__ListAccessibleCustomersResponse.ServerRespo
// nse.Header or (if a response was returned at all) in
// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check
// whether the returned error was because http.StatusNotModified was returned.
func (c *CustomersListAccessibleCustomersCall) Do(opts ...googleapi.CallOption) (*GoogleAdsSearchads360V0Services__ListAccessibleCustomersResponse, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, gensupport.WrapError(&googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		})
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, gensupport.WrapError(err)
	}
	ret := &GoogleAdsSearchads360V0Services__ListAccessibleCustomersResponse{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
}

type CustomersCustomColumnsGetCall struct {
	s            *Service
	resourceName string
	urlParams_   gensupport.URLParams
	ifNoneMatch_ string
	ctx_         context.Context
	header_      http.Header
}

// Get: Returns the requested custom column in full detail.
//
// - resourceName: The resource name of the custom column to fetch.
func (r *CustomersCustomColumnsService) Get(resourceName string) *CustomersCustomColumnsGetCall {
	c := &CustomersCustomColumnsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.resourceName = resourceName
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse for more
// details.
func (c *CustomersCustomColumnsGetCall) Fields(s ...googleapi.Field) *CustomersCustomColumnsGetCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// IfNoneMatch sets an optional parameter which makes the operation fail if the
// object's ETag matches the given value. This is useful for getting updates
// only after the object has changed since the last request.
func (c *CustomersCustomColumnsGetCall) IfNoneMatch(entityTag string) *CustomersCustomColumnsGetCall {
	c.ifNoneMatch_ = entityTag
	return c
}

// Context sets the context to be used in this call's Do method.
func (c *CustomersCustomColumnsGetCall) Context(ctx context.Context) *CustomersCustomColumnsGetCall {
	c.ctx_ = ctx
	return c
}

// Header returns a http.Header that can be modified by the caller to add
// headers to the request.
func (c *CustomersCustomColumnsGetCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *CustomersCustomColumnsGetCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_)
	if c.ifNoneMatch_ != "" {
		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
	}
	var body io.Reader = nil
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "v0/{+resourceName}")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("GET", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	googleapi.Expand(req.URL, map[string]string{
		"resourceName": c.resourceName,
	})
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "searchads360.customers.customColumns.get" call.
// Any non-2xx status code is an error. Response headers are in either
// *GoogleAdsSearchads360V0Resources__CustomColumn.ServerResponse.Header or (if
// a response was returned at all) in error.(*googleapi.Error).Header. Use
// googleapi.IsNotModified to check whether the returned error was because
// http.StatusNotModified was returned.
func (c *CustomersCustomColumnsGetCall) Do(opts ...googleapi.CallOption) (*GoogleAdsSearchads360V0Resources__CustomColumn, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, gensupport.WrapError(&googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		})
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, gensupport.WrapError(err)
	}
	ret := &GoogleAdsSearchads360V0Resources__CustomColumn{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
}

type CustomersCustomColumnsListCall struct {
	s            *Service
	customerId   string
	urlParams_   gensupport.URLParams
	ifNoneMatch_ string
	ctx_         context.Context
	header_      http.Header
}

// List: Returns all the custom columns associated with the customer in full
// detail.
//
//   - customerId: The ID of the customer to apply the CustomColumn list
//     operation to.
func (r *CustomersCustomColumnsService) List(customerId string) *CustomersCustomColumnsListCall {
	c := &CustomersCustomColumnsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.customerId = customerId
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse for more
// details.
func (c *CustomersCustomColumnsListCall) Fields(s ...googleapi.Field) *CustomersCustomColumnsListCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// IfNoneMatch sets an optional parameter which makes the operation fail if the
// object's ETag matches the given value. This is useful for getting updates
// only after the object has changed since the last request.
func (c *CustomersCustomColumnsListCall) IfNoneMatch(entityTag string) *CustomersCustomColumnsListCall {
	c.ifNoneMatch_ = entityTag
	return c
}

// Context sets the context to be used in this call's Do method.
func (c *CustomersCustomColumnsListCall) Context(ctx context.Context) *CustomersCustomColumnsListCall {
	c.ctx_ = ctx
	return c
}

// Header returns a http.Header that can be modified by the caller to add
// headers to the request.
func (c *CustomersCustomColumnsListCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *CustomersCustomColumnsListCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_)
	if c.ifNoneMatch_ != "" {
		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
	}
	var body io.Reader = nil
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "v0/customers/{+customerId}/customColumns")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("GET", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	googleapi.Expand(req.URL, map[string]string{
		"customerId": c.customerId,
	})
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "searchads360.customers.customColumns.list" call.
// Any non-2xx status code is an error. Response headers are in either
// *GoogleAdsSearchads360V0Services__ListCustomColumnsResponse.ServerResponse.He
// ader or (if a response was returned at all) in
// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check
// whether the returned error was because http.StatusNotModified was returned.
func (c *CustomersCustomColumnsListCall) Do(opts ...googleapi.CallOption) (*GoogleAdsSearchads360V0Services__ListCustomColumnsResponse, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, gensupport.WrapError(&googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		})
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, gensupport.WrapError(err)
	}
	ret := &GoogleAdsSearchads360V0Services__ListCustomColumnsResponse{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
}

type CustomersSearchAds360SearchCall struct {
	s                                                          *Service
	customerId                                                 string
	googleadssearchads360v0services__searchsearchads360request *GoogleAdsSearchads360V0Services__SearchSearchAds360Request
	urlParams_                                                 gensupport.URLParams
	ctx_                                                       context.Context
	header_                                                    http.Header
}

// Search: Returns all rows that match the search query. List of thrown errors:
// AuthenticationError () [AuthorizationError]() HeaderError ()
// [InternalError]() QueryError () [QuotaError]() RequestError ()
//
// - customerId: The ID of the customer being queried.
func (r *CustomersSearchAds360Service) Search(customerId string, googleadssearchads360v0services__searchsearchads360request *GoogleAdsSearchads360V0Services__SearchSearchAds360Request) *CustomersSearchAds360SearchCall {
	c := &CustomersSearchAds360SearchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.customerId = customerId
	c.googleadssearchads360v0services__searchsearchads360request = googleadssearchads360v0services__searchsearchads360request
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse for more
// details.
func (c *CustomersSearchAds360SearchCall) Fields(s ...googleapi.Field) *CustomersSearchAds360SearchCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// Context sets the context to be used in this call's Do method.
func (c *CustomersSearchAds360SearchCall) Context(ctx context.Context) *CustomersSearchAds360SearchCall {
	c.ctx_ = ctx
	return c
}

// Header returns a http.Header that can be modified by the caller to add
// headers to the request.
func (c *CustomersSearchAds360SearchCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *CustomersSearchAds360SearchCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_)
	var body io.Reader = nil
	body, err := googleapi.WithoutDataWrapper.JSONReader(c.googleadssearchads360v0services__searchsearchads360request)
	if err != nil {
		return nil, err
	}
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "v0/customers/{+customerId}/searchAds360:search")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("POST", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	googleapi.Expand(req.URL, map[string]string{
		"customerId": c.customerId,
	})
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "searchads360.customers.searchAds360.search" call.
// Any non-2xx status code is an error. Response headers are in either
// *GoogleAdsSearchads360V0Services__SearchSearchAds360Response.ServerResponse.H
// eader or (if a response was returned at all) in
// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check
// whether the returned error was because http.StatusNotModified was returned.
func (c *CustomersSearchAds360SearchCall) Do(opts ...googleapi.CallOption) (*GoogleAdsSearchads360V0Services__SearchSearchAds360Response, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, gensupport.WrapError(&googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		})
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, gensupport.WrapError(err)
	}
	ret := &GoogleAdsSearchads360V0Services__SearchSearchAds360Response{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
}

// Pages invokes f for each page of results.
// A non-nil error returned from f will halt the iteration.
// The provided context supersedes any context provided to the Context method.
func (c *CustomersSearchAds360SearchCall) Pages(ctx context.Context, f func(*GoogleAdsSearchads360V0Services__SearchSearchAds360Response) error) error {
	c.ctx_ = ctx
	defer func(pt string) { c.googleadssearchads360v0services__searchsearchads360request.PageToken = pt }(c.googleadssearchads360v0services__searchsearchads360request.PageToken)
	for {
		x, err := c.Do()
		if err != nil {
			return err
		}
		if err := f(x); err != nil {
			return err
		}
		if x.NextPageToken == "" {
			return nil
		}
		c.googleadssearchads360v0services__searchsearchads360request.PageToken = x.NextPageToken
	}
}

type SearchAds360FieldsGetCall struct {
	s            *Service
	resourceName string
	urlParams_   gensupport.URLParams
	ifNoneMatch_ string
	ctx_         context.Context
	header_      http.Header
}

// Get: Returns just the requested field. List of thrown errors:
// AuthenticationError () [AuthorizationError]() HeaderError ()
// [InternalError]() QuotaError () [RequestError]()
//
// - resourceName: The resource name of the field to get.
func (r *SearchAds360FieldsService) Get(resourceName string) *SearchAds360FieldsGetCall {
	c := &SearchAds360FieldsGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.resourceName = resourceName
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse for more
// details.
func (c *SearchAds360FieldsGetCall) Fields(s ...googleapi.Field) *SearchAds360FieldsGetCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// IfNoneMatch sets an optional parameter which makes the operation fail if the
// object's ETag matches the given value. This is useful for getting updates
// only after the object has changed since the last request.
func (c *SearchAds360FieldsGetCall) IfNoneMatch(entityTag string) *SearchAds360FieldsGetCall {
	c.ifNoneMatch_ = entityTag
	return c
}

// Context sets the context to be used in this call's Do method.
func (c *SearchAds360FieldsGetCall) Context(ctx context.Context) *SearchAds360FieldsGetCall {
	c.ctx_ = ctx
	return c
}

// Header returns a http.Header that can be modified by the caller to add
// headers to the request.
func (c *SearchAds360FieldsGetCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *SearchAds360FieldsGetCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_)
	if c.ifNoneMatch_ != "" {
		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
	}
	var body io.Reader = nil
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "v0/{+resourceName}")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("GET", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	googleapi.Expand(req.URL, map[string]string{
		"resourceName": c.resourceName,
	})
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "searchads360.searchAds360Fields.get" call.
// Any non-2xx status code is an error. Response headers are in either
// *GoogleAdsSearchads360V0Resources__SearchAds360Field.ServerResponse.Header
// or (if a response was returned at all) in error.(*googleapi.Error).Header.
// Use googleapi.IsNotModified to check whether the returned error was because
// http.StatusNotModified was returned.
func (c *SearchAds360FieldsGetCall) Do(opts ...googleapi.CallOption) (*GoogleAdsSearchads360V0Resources__SearchAds360Field, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, gensupport.WrapError(&googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		})
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, gensupport.WrapError(err)
	}
	ret := &GoogleAdsSearchads360V0Resources__SearchAds360Field{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
}

type SearchAds360FieldsSearchCall struct {
	s                                                                *Service
	googleadssearchads360v0services__searchsearchads360fieldsrequest *GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsRequest
	urlParams_                                                       gensupport.URLParams
	ctx_                                                             context.Context
	header_                                                          http.Header
}

// Search: Returns all fields that match the search query
// (/search-ads/reporting/concepts/field-service#use_a_query_to_get_field_detail
// s). List of thrown errors: AuthenticationError () [AuthorizationError]()
// HeaderError () [InternalError]() QueryError () [QuotaError]() RequestError
// ()
func (r *SearchAds360FieldsService) Search(googleadssearchads360v0services__searchsearchads360fieldsrequest *GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsRequest) *SearchAds360FieldsSearchCall {
	c := &SearchAds360FieldsSearchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
	c.googleadssearchads360v0services__searchsearchads360fieldsrequest = googleadssearchads360v0services__searchsearchads360fieldsrequest
	return c
}

// Fields allows partial responses to be retrieved. See
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse for more
// details.
func (c *SearchAds360FieldsSearchCall) Fields(s ...googleapi.Field) *SearchAds360FieldsSearchCall {
	c.urlParams_.Set("fields", googleapi.CombineFields(s))
	return c
}

// Context sets the context to be used in this call's Do method.
func (c *SearchAds360FieldsSearchCall) Context(ctx context.Context) *SearchAds360FieldsSearchCall {
	c.ctx_ = ctx
	return c
}

// Header returns a http.Header that can be modified by the caller to add
// headers to the request.
func (c *SearchAds360FieldsSearchCall) Header() http.Header {
	if c.header_ == nil {
		c.header_ = make(http.Header)
	}
	return c.header_
}

func (c *SearchAds360FieldsSearchCall) doRequest(alt string) (*http.Response, error) {
	reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_)
	var body io.Reader = nil
	body, err := googleapi.WithoutDataWrapper.JSONReader(c.googleadssearchads360v0services__searchsearchads360fieldsrequest)
	if err != nil {
		return nil, err
	}
	c.urlParams_.Set("alt", alt)
	c.urlParams_.Set("prettyPrint", "false")
	urls := googleapi.ResolveRelative(c.s.BasePath, "v0/searchAds360Fields:search")
	urls += "?" + c.urlParams_.Encode()
	req, err := http.NewRequest("POST", urls, body)
	if err != nil {
		return nil, err
	}
	req.Header = reqHeaders
	return gensupport.SendRequest(c.ctx_, c.s.client, req)
}

// Do executes the "searchads360.searchAds360Fields.search" call.
// Any non-2xx status code is an error. Response headers are in either
// *GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsResponse.ServerResp
// onse.Header or (if a response was returned at all) in
// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check
// whether the returned error was because http.StatusNotModified was returned.
func (c *SearchAds360FieldsSearchCall) Do(opts ...googleapi.CallOption) (*GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsResponse, error) {
	gensupport.SetOptions(c.urlParams_, opts...)
	res, err := c.doRequest("json")
	if res != nil && res.StatusCode == http.StatusNotModified {
		if res.Body != nil {
			res.Body.Close()
		}
		return nil, gensupport.WrapError(&googleapi.Error{
			Code:   res.StatusCode,
			Header: res.Header,
		})
	}
	if err != nil {
		return nil, err
	}
	defer googleapi.CloseBody(res)
	if err := googleapi.CheckResponse(res); err != nil {
		return nil, gensupport.WrapError(err)
	}
	ret := &GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsResponse{
		ServerResponse: googleapi.ServerResponse{
			Header:         res.Header,
			HTTPStatusCode: res.StatusCode,
		},
	}
	target := &ret
	if err := gensupport.DecodeResponse(target, res); err != nil {
		return nil, err
	}
	return ret, nil
}

// Pages invokes f for each page of results.
// A non-nil error returned from f will halt the iteration.
// The provided context supersedes any context provided to the Context method.
func (c *SearchAds360FieldsSearchCall) Pages(ctx context.Context, f func(*GoogleAdsSearchads360V0Services__SearchSearchAds360FieldsResponse) error) error {
	c.ctx_ = ctx
	defer func(pt string) { c.googleadssearchads360v0services__searchsearchads360fieldsrequest.PageToken = pt }(c.googleadssearchads360v0services__searchsearchads360fieldsrequest.PageToken)
	for {
		x, err := c.Do()
		if err != nil {
			return err
		}
		if err := f(x); err != nil {
			return err
		}
		if x.NextPageToken == "" {
			return nil
		}
		c.googleadssearchads360v0services__searchsearchads360fieldsrequest.PageToken = x.NextPageToken
	}
}
