import {z} from 'zod' export type GetApiV4AdvertisersAdvertisersIdAdGroupAdsArgs = {advertisersId: string, filter?: string | undefined, orderBy?: string | undefined, pageSize?: number | undefined, pageToken?: string | undefined}; export type GetApiV4AdvertisersAdvertisersIdAdGroupAdsOptions = {baseUrl?: string | undefined, Oauth2?: string | undefined, Oauth2c?: string | undefined, fetch?: typeof fetch | undefined}; export const adPolicyTopicAppealInfo = z.object({appealFormLink: z.string().optional(), appealType: z.enum(["AD_POLICY_APPEAL_TYPE_UNKNOWN", "SELF_SERVICE_APPEAL", "APPEAL_FORM"]).optional()}); export const adPolicyCriterionRestriction = z.object({countryCriterionId: z.string().optional(), countryLabel: z.string().optional()}); export const adPolicyTopicConstraintAdPolicyCountryConstraintList = z.object({countries: z.array(adPolicyCriterionRestriction).optional()}); export const adPolicyTopicConstraintAdPolicyGlobalCertificateDomainMismatchConstraint = z.object({}); export const adPolicyTopicConstraintAdPolicyGlobalCertificateMissingConstraint = z.object({}); export const adPolicyTopicConstraintAdPolicyResellerConstraint = z.object({}); export const adPolicyTopicConstraint = z.object({certificateDomainMismatchCountryList: adPolicyTopicConstraintAdPolicyCountryConstraintList.optional(), certificateMissingCountryList: adPolicyTopicConstraintAdPolicyCountryConstraintList.optional(), countryConstraint: adPolicyTopicConstraintAdPolicyCountryConstraintList.optional(), globalCertificateDomainMismatch: adPolicyTopicConstraintAdPolicyGlobalCertificateDomainMismatchConstraint.optional(), globalCertificateMissing: adPolicyTopicConstraintAdPolicyGlobalCertificateMissingConstraint.optional(), requestCertificateFormLink: z.string().optional(), resellerConstraint: adPolicyTopicConstraintAdPolicyResellerConstraint.optional()}); export const adPolicyTopicEvidenceCounterfeit = z.object({owners: z.array(z.string()).optional()}); export const adPolicyTopicEvidenceDestinationMismatch = z.object({uriTypes: z.array(z.enum(["AD_POLICY_TOPIC_EVIDENCE_DESTINATION_MISMATCH_URL_TYPE_UNKNOWN", "DISPLAY_URL", "FINAL_URL", "FINAL_MOBILE_URL", "TRACKING_URL", "MOBILE_TRACKING_URL"])).optional()}); export const adPolicyTopicEvidenceDestinationNotWorking = z.object({device: z.enum(["AD_POLICY_TOPIC_EVIDENCE_DESTINATION_NOT_WORKING_DEVICE_TYPE_UNKNOWN", "DESKTOP", "ANDROID", "IOS"]).optional(), dnsErrorType: z.enum(["AD_POLICY_TOPIC_EVIDENCE_DESTINATION_NOT_WORKING_DNS_ERROR_TYPE_UNKNOWN", "HOSTNAME_NOT_FOUND", "GOOGLE_CRAWLER_DNS_ISSUE"]).optional(), expandedUri: z.string().optional(), httpErrorCode: z.string().optional(), lastCheckedTime: z.string().optional()}); export const adPolicyTopicEvidenceDestinationTextList = z.object({destinationTexts: z.array(z.string()).optional()}); export const adPolicyTopicEvidenceLegalRemovalDmca = z.object({complainant: z.string().optional()}); export const adPolicyTopicEvidenceLegalRemovalLocalLegal = z.object({lawType: z.string().optional()}); export const adPolicyTopicEvidenceLegalRemoval = z.object({complaintType: z.enum(["AD_POLICY_TOPIC_EVIDENCE_LEGAL_REMOVAL_COMPLAINT_TYPE_UNKNOWN", "COPYRIGHT", "COURT_ORDER", "LOCAL_LEGAL"]).optional(), countryRestrictions: z.array(adPolicyCriterionRestriction).optional(), dmca: adPolicyTopicEvidenceLegalRemovalDmca.optional(), localLegal: adPolicyTopicEvidenceLegalRemovalLocalLegal.optional(), restrictedUris: z.array(z.string()).optional()}); export const adPolicyTopicEvidenceRegionalRequirementsRegionalRequirementsEntry = z.object({countryRestrictions: z.array(adPolicyCriterionRestriction).optional(), legalPolicy: z.string().optional()}); export const adPolicyTopicEvidenceRegionalRequirements = z.object({regionalRequirementsEntries: z.array(adPolicyTopicEvidenceRegionalRequirementsRegionalRequirementsEntry).optional()}); export const adPolicyTopicEvidenceTextList = z.object({texts: z.array(z.string()).optional()}); export const adPolicyTopicEvidenceTrademark = z.object({countryRestrictions: z.array(adPolicyCriterionRestriction).optional(), owner: z.string().optional(), term: z.string().optional()}); export const adPolicyTopicEvidenceWebsiteList = z.object({websites: z.array(z.string()).optional()}); export const adPolicyTopicEvidence = z.object({counterfeit: adPolicyTopicEvidenceCounterfeit.optional(), destinationMismatch: adPolicyTopicEvidenceDestinationMismatch.optional(), destinationNotWorking: adPolicyTopicEvidenceDestinationNotWorking.optional(), destinationTextList: adPolicyTopicEvidenceDestinationTextList.optional(), httpCode: z.number().int().optional(), languageCode: z.string().optional(), legalRemoval: adPolicyTopicEvidenceLegalRemoval.optional(), regionalRequirements: adPolicyTopicEvidenceRegionalRequirements.optional(), textList: adPolicyTopicEvidenceTextList.optional(), trademark: adPolicyTopicEvidenceTrademark.optional(), websiteList: adPolicyTopicEvidenceWebsiteList.optional()}); export const adPolicyTopicEntry = z.object({appealInfo: adPolicyTopicAppealInfo.optional(), helpCenterLink: z.string().optional(), policyDecisionType: z.enum(["AD_POLICY_DECISION_TYPE_UNKNOWN", "PURSUANT_TO_NOTICE", "GOOGLE_INVESTIGATION"]).optional(), policyEnforcementMeans: z.enum(["AD_POLICY_ENFORCEMENT_MEANS_UNKNOWN", "AUTOMATED", "HUMAN_REVIEW"]).optional(), policyLabel: z.string().optional(), policyTopic: z.string().optional(), policyTopicConstraints: z.array(adPolicyTopicConstraint).optional(), policyTopicDescription: z.string().optional(), policyTopicEvidences: z.array(adPolicyTopicEvidence).optional(), policyTopicType: z.enum(["AD_POLICY_TOPIC_ENTRY_TYPE_UNKNOWN", "PROHIBITED", "FULLY_LIMITED", "LIMITED", "DESCRIPTIVE", "BROADENING", "AREA_OF_INTEREST_ONLY"]).optional()}); export const adPolicy = z.object({adPolicyApprovalStatus: z.enum(["AD_POLICY_APPROVAL_STATUS_UNKNOWN", "DISAPPROVED", "APPROVED_LIMITED", "APPROVED", "AREA_OF_INTEREST_ONLY"]).optional(), adPolicyReviewStatus: z.enum(["AD_POLICY_REVIEW_STATUS_UNKNOWN", "REVIEW_IN_PROGRESS", "REVIEWED", "UNDER_APPEAL", "ELIGIBLE_MAY_SERVE"]).optional(), adPolicyTopicEntry: z.array(adPolicyTopicEntry).optional()}); export const adUrl = z.object({type: z.enum(["AD_URL_TYPE_UNSPECIFIED", "AD_URL_TYPE_BEACON_IMPRESSION", "AD_URL_TYPE_BEACON_EXPANDABLE_DCM_IMPRESSION", "AD_URL_TYPE_BEACON_CLICK", "AD_URL_TYPE_BEACON_SKIP"]).optional(), url: z.string().optional()}); export const youtubeVideoDetails = z.object({id: z.string().optional(), unavailableReason: z.enum(["VIDEO_UNAVAILABLE_REASON_UNSPECIFIED", "VIDEO_UNAVAILABLE_REASON_PRIVATE", "VIDEO_UNAVAILABLE_REASON_DELETED"]).optional(), videoAssetId: z.string().optional()}); export const audioAd = z.object({displayUrl: z.string().optional(), finalUrl: z.string().optional(), trackingUrl: z.string().optional(), video: youtubeVideoDetails.optional()}); export const dimensions = z.object({heightPixels: z.number().int().optional(), widthPixels: z.number().int().optional()}); export const imageAsset = z.object({assetId: z.string().optional(), fileSize: z.string().optional(), fullSize: dimensions.optional(), mimeType: z.string().optional()}); export const commonInStreamAttribute = z.object({actionButtonLabel: z.string().optional(), actionHeadline: z.string().optional(), companionBanner: imageAsset.optional(), displayUrl: z.string().optional(), finalUrl: z.string().optional(), trackingUrl: z.string().optional(), video: youtubeVideoDetails.optional()}); export const bumperAd = z.object({commonInStreamAttribute: commonInStreamAttribute.optional()}); export const dcmTrackingInfo = z.object({creativeId: z.string().optional(), placementId: z.string().optional(), trackingAdId: z.string().optional()}); export const carouselCard = z.object({callToAction: z.string().optional(), finalMobileUrl: z.string().optional(), finalUrl: z.string().optional(), headline: z.string().optional(), marketingImage: imageAsset.optional(), portraitMarketingImage: imageAsset.optional(), squareMarketingImage: imageAsset.optional()}); export const demandGenCarouselAd = z.object({businessName: z.string().optional(), cards: z.array(carouselCard).optional(), customParameters: z.record(z.string(), z.string()).optional(), description: z.string().optional(), finalUrl: z.string().optional(), finalUrlSuffix: z.string().optional(), headline: z.string().optional(), logo: imageAsset.optional(), trackingUrl: z.string().optional(), userSpecifiedTrackingUrl: z.string().optional()}); export const demandGenImageAd = z.object({businessName: z.string().optional(), callToAction: z.string().optional(), customParameters: z.record(z.string(), z.string()).optional(), descriptions: z.array(z.string()).optional(), finalMobileUrl: z.string().optional(), finalUrl: z.string().optional(), finalUrlSuffix: z.string().optional(), headlines: z.array(z.string()).optional(), logoImages: z.array(imageAsset).optional(), marketingImages: z.array(imageAsset).optional(), portraitMarketingImages: z.array(imageAsset).optional(), squareMarketingImages: z.array(imageAsset).optional(), trackingUrl: z.string().optional(), userSpecifiedTrackingUrl: z.string().optional()}); export const demandGenProductAd = z.object({businessName: z.string().optional(), callToAction: z.enum(["CALL_TO_ACTION_UNSPECIFIED", "AUTOMATED", "LEARN_MORE", "GET_QUOTE", "APPLY_NOW", "SIGN_UP", "CONTACT_US", "SUBSCRIBE", "DOWNLOAD", "BOOK_NOW", "SHOP_NOW", "BUY_NOW", "DONATE_NOW", "ORDER_NOW", "PLAY_NOW", "SEE_MORE", "START_NOW", "VISIT_SITE", "WATCH_NOW"]).optional(), customParameters: z.record(z.string(), z.string()).optional(), description: z.string().optional(), displayUrlBreadcrumb1: z.string().optional(), displayUrlBreadcrumb2: z.string().optional(), finalUrl: z.string().optional(), finalUrlSuffix: z.string().optional(), headline: z.string().optional(), logo: imageAsset.optional(), trackingUrl: z.string().optional(), userSpecifiedTrackingUrl: z.string().optional()}); export const demandGenVideoAd = z.object({businessName: z.string().optional(), callToAction: z.enum(["CALL_TO_ACTION_UNSPECIFIED", "AUTOMATED", "LEARN_MORE", "GET_QUOTE", "APPLY_NOW", "SIGN_UP", "CONTACT_US", "SUBSCRIBE", "DOWNLOAD", "BOOK_NOW", "SHOP_NOW", "BUY_NOW", "DONATE_NOW", "ORDER_NOW", "PLAY_NOW", "SEE_MORE", "START_NOW", "VISIT_SITE", "WATCH_NOW"]).optional(), companionBanner: imageAsset.optional(), customParameters: z.record(z.string(), z.string()).optional(), descriptions: z.array(z.string()).optional(), displayUrlBreadcrumb1: z.string().optional(), displayUrlBreadcrumb2: z.string().optional(), finalMobileUrl: z.string().optional(), finalUrl: z.string().optional(), finalUrlSuffix: z.string().optional(), headlines: z.array(z.string()).optional(), logo: imageAsset.optional(), longHeadlines: z.array(z.string()).optional(), trackingUrl: z.string().optional(), userSpecifiedTrackingUrl: z.string().optional(), videos: z.array(youtubeVideoDetails).optional()}); export const displayVideoSourceAd = z.object({creativeId: z.string().optional()}); export const inStreamAd = z.object({commonInStreamAttribute: commonInStreamAttribute.optional(), customParameters: z.record(z.string(), z.string()).optional()}); export const mastheadAd = z.object({autoplayVideoDuration: z.string().optional(), autoplayVideoStartMillisecond: z.string().optional(), callToActionButtonLabel: z.string().optional(), callToActionFinalUrl: z.string().optional(), callToActionTrackingUrl: z.string().optional(), companionYoutubeVideos: z.array(youtubeVideoDetails).optional(), description: z.string().optional(), headline: z.string().optional(), showChannelArt: z.boolean().optional(), video: youtubeVideoDetails.optional(), videoAspectRatio: z.enum(["VIDEO_ASPECT_RATIO_UNSPECIFIED", "VIDEO_ASPECT_RATIO_WIDESCREEN", "VIDEO_ASPECT_RATIO_FIXED_16_9"]).optional()}); export const nonSkippableAd = z.object({commonInStreamAttribute: commonInStreamAttribute.optional(), customParameters: z.record(z.string(), z.string()).optional()}); export const videoDiscoveryAd = z.object({description1: z.string().optional(), description2: z.string().optional(), headline: z.string().optional(), thumbnail: z.enum(["THUMBNAIL_UNSPECIFIED", "THUMBNAIL_DEFAULT", "THUMBNAIL_1", "THUMBNAIL_2", "THUMBNAIL_3"]).optional(), video: youtubeVideoDetails.optional()}); export const videoPerformanceAd = z.object({actionButtonLabels: z.array(z.string()).optional(), businessName: z.string().optional(), companionBanners: z.array(imageAsset).optional(), customParameters: z.record(z.string(), z.string()).optional(), descriptions: z.array(z.string()).optional(), displayUrlBreadcrumb1: z.string().optional(), displayUrlBreadcrumb2: z.string().optional(), domain: z.string().optional(), finalUrl: z.string().optional(), headlines: z.array(z.string()).optional(), logo: imageAsset.optional(), longHeadlines: z.array(z.string()).optional(), trackingUrl: z.string().optional(), videos: z.array(youtubeVideoDetails).optional()}); export const adGroupAd = z.object({adGroupAdId: z.string().optional(), adGroupId: z.string().optional(), adPolicy: adPolicy.optional(), adUrls: z.array(adUrl).optional(), advertiserId: z.string().optional(), audioAd: audioAd.optional(), bumperAd: bumperAd.optional(), dcmTrackingInfo: dcmTrackingInfo.optional(), demandGenCarouselAd: demandGenCarouselAd.optional(), demandGenImageAd: demandGenImageAd.optional(), demandGenProductAd: demandGenProductAd.optional(), demandGenVideoAd: demandGenVideoAd.optional(), displayName: z.string().optional(), displayVideoSourceAd: displayVideoSourceAd.optional(), entityStatus: z.enum(["ENTITY_STATUS_UNSPECIFIED", "ENTITY_STATUS_ACTIVE", "ENTITY_STATUS_ARCHIVED", "ENTITY_STATUS_DRAFT", "ENTITY_STATUS_PAUSED", "ENTITY_STATUS_SCHEDULED_FOR_DELETION"]).optional(), inStreamAd: inStreamAd.optional(), mastheadAd: mastheadAd.optional(), name: z.string().optional(), nonSkippableAd: nonSkippableAd.optional(), videoDiscoverAd: videoDiscoveryAd.optional(), videoPerformanceAd: videoPerformanceAd.optional()}); export const listAdGroupAdsResponse = z.object({adGroupAds: z.array(adGroupAd).optional(), nextPageToken: z.string().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Lists ad group ads. * * GET /v4/advertisers/{advertisersId}/adGroupAds */ export const getApiV4AdvertisersAdvertisersIdAdGroupAds = async (args: GetApiV4AdvertisersAdvertisersIdAdGroupAdsArgs, options?: GetApiV4AdvertisersAdvertisersIdAdGroupAdsOptions) => { const {baseUrl = "https://displayvideo.googleapis.com", fetch: fetchFn = fetch, Oauth2, Oauth2c} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.filter != null) query.append("filter", String(args.filter)) if (args.orderBy != null) query.append("orderBy", String(args.orderBy)) if (args.pageSize != null) query.append("pageSize", String(args.pageSize)) if (args.pageToken != null) query.append("pageToken", String(args.pageToken)) if (Oauth2 !== undefined) headers.set('authorization', `Bearer ${Oauth2}`) if (Oauth2c !== undefined) headers.set('authorization', `Bearer ${Oauth2c}`) const url = `${baseUrl.replace(/\/+$/, '')}/v4/advertisers/${encodeURIComponent(String(args.advertisersId))}/adGroupAds${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(listAdGroupAdsResponse, await res.json()) };