import {z} from 'zod' export type GetApiV1BiddersBiddersIdCreativesArgs = {biddersId: string, adCategoryTaxonomyOverride?: ('AD_CATEGORY_TAXONOMY_UNSPECIFIED' | 'GOOGLE_AD_CATEGORY_TAXONOMY' | 'IAB_CONTENT_1_0' | 'IAB_CONTENT_2_2') | undefined, filter?: string | undefined, pageSize?: number | undefined, pageToken?: string | undefined, view?: ('CREATIVE_VIEW_UNSPECIFIED' | 'SERVING_DECISION_ONLY' | 'FULL') | undefined}; export type GetApiV1BiddersBiddersIdCreativesOptions = {baseUrl?: string | undefined, Oauth2?: string | undefined, Oauth2c?: string | undefined, fetch?: typeof fetch | undefined}; export const adTechnologyProviders = z.object({detectedGvlIds: z.array(z.string()).optional(), detectedProviderIds: z.array(z.string()).optional(), unidentifiedProviderDomains: z.array(z.string()).optional()}); export const destinationNotCrawlableEvidence = z.object({crawlTime: z.string().optional(), crawledUrl: z.string().optional(), reason: z.enum(["REASON_UNSPECIFIED", "UNREACHABLE_ROBOTS", "TIMEOUT_ROBOTS", "ROBOTED_DENIED", "UNKNOWN"]).optional()}); export const destinationNotWorkingEvidence = z.object({dnsError: z.enum(["DNS_ERROR_UNSPECIFIED", "ERROR_DNS", "GOOGLE_CRAWLER_DNS_ISSUE"]).optional(), expandedUrl: z.string().optional(), httpError: z.number().int().optional(), invalidPage: z.enum(["INVALID_PAGE_UNSPECIFIED", "EMPTY_OR_ERROR_PAGE"]).optional(), lastCheckTime: z.string().optional(), platform: z.enum(["PLATFORM_UNSPECIFIED", "PERSONAL_COMPUTER", "ANDROID", "IOS"]).optional(), redirectionError: z.enum(["REDIRECTION_ERROR_UNSPECIFIED", "TOO_MANY_REDIRECTS", "INVALID_REDIRECT", "EMPTY_REDIRECT", "REDIRECT_ERROR_UNKNOWN"]).optional(), urlRejected: z.enum(["URL_REJECTED_UNSPECIFIED", "BAD_REQUEST", "MALFORMED_URL", "URL_REJECTED_UNKNOWN"]).optional()}); export const destinationUrlEvidence = z.object({destinationUrl: z.string().optional()}); export const domainCalls = z.object({domain: z.string().optional(), httpCallCount: z.number().int().optional()}); export const domainCallEvidence = z.object({topHttpCallDomains: z.array(domainCalls).optional(), totalHttpCallCount: z.number().int().optional()}); export const urlDownloadSize = z.object({downloadSizeKb: z.number().int().optional(), normalizedUrl: z.string().optional()}); export const downloadSizeEvidence = z.object({topUrlDownloadSizeBreakdowns: z.array(urlDownloadSize).optional(), totalDownloadSizeKb: z.number().int().optional()}); export const httpCallEvidence = z.object({urls: z.array(z.string()).optional()}); export const httpCookieEvidence = z.object({cookieNames: z.array(z.string()).optional(), maxCookieCount: z.number().int().optional()}); export const policyTopicEvidence = z.object({destinationNotCrawlable: destinationNotCrawlableEvidence.optional(), destinationNotWorking: destinationNotWorkingEvidence.optional(), destinationUrl: destinationUrlEvidence.optional(), domainCall: domainCallEvidence.optional(), downloadSize: downloadSizeEvidence.optional(), httpCall: httpCallEvidence.optional(), httpCookie: httpCookieEvidence.optional()}); export const policyTopicEntry = z.object({evidences: z.array(policyTopicEvidence).optional(), helpCenterUrl: z.string().optional(), missingCertificate: z.boolean().optional(), policyTopic: z.string().optional()}); export const policyCompliance = z.object({status: z.enum(["STATUS_UNSPECIFIED", "PENDING_REVIEW", "DISAPPROVED", "APPROVED", "CERTIFICATE_REQUIRED"]).optional(), topics: z.array(policyTopicEntry).optional()}); export const advertiserAndBrand = z.object({advertiserId: z.string().optional(), advertiserName: z.string().optional(), brandId: z.string().optional(), brandName: z.string().optional()}); export const creativeServingDecision = z.object({adTechnologyProviders: adTechnologyProviders.optional(), chinaPolicyCompliance: policyCompliance.optional(), dealsPolicyCompliance: policyCompliance.optional(), detectedAdvertisers: z.array(advertiserAndBrand).optional(), detectedAttributes: z.array(z.enum(["ATTRIBUTE_UNSPECIFIED", "IMAGE_RICH_MEDIA", "ADOBE_FLASH_FLV", "IS_TAGGED", "IS_COOKIE_TARGETED", "IS_USER_INTEREST_TARGETED", "EXPANDING_DIRECTION_NONE", "EXPANDING_DIRECTION_UP", "EXPANDING_DIRECTION_DOWN", "EXPANDING_DIRECTION_LEFT", "EXPANDING_DIRECTION_RIGHT", "EXPANDING_DIRECTION_UP_LEFT", "EXPANDING_DIRECTION_UP_RIGHT", "EXPANDING_DIRECTION_DOWN_LEFT", "EXPANDING_DIRECTION_DOWN_RIGHT", "CREATIVE_TYPE_HTML", "CREATIVE_TYPE_VAST_VIDEO", "EXPANDING_DIRECTION_UP_OR_DOWN", "EXPANDING_DIRECTION_LEFT_OR_RIGHT", "EXPANDING_DIRECTION_ANY_DIAGONAL", "EXPANDING_ACTION_ROLLOVER_TO_EXPAND", "INSTREAM_VAST_VIDEO_TYPE_VPAID_FLASH", "RICH_MEDIA_CAPABILITY_TYPE_MRAID", "RICH_MEDIA_CAPABILITY_TYPE_FLASH", "RICH_MEDIA_CAPABILITY_TYPE_HTML5", "SKIPPABLE_INSTREAM_VIDEO", "RICH_MEDIA_CAPABILITY_TYPE_SSL", "RICH_MEDIA_CAPABILITY_TYPE_NON_SSL", "RICH_MEDIA_CAPABILITY_TYPE_INTERSTITIAL", "NON_SKIPPABLE_INSTREAM_VIDEO", "NATIVE_ELIGIBILITY_ELIGIBLE", "NON_VPAID", "NATIVE_ELIGIBILITY_NOT_ELIGIBLE", "ANY_INTERSTITIAL", "NON_INTERSTITIAL", "IN_BANNER_VIDEO", "RENDERING_SIZELESS_ADX", "OMSDK_1_0", "RENDERING_PLAYABLE"])).optional(), detectedCategories: z.array(z.string()).optional(), detectedCategoriesTaxonomy: z.enum(["AD_CATEGORY_TAXONOMY_UNSPECIFIED", "GOOGLE_AD_CATEGORY_TAXONOMY", "IAB_CONTENT_1_0", "IAB_CONTENT_2_2"]).optional(), detectedClickThroughUrls: z.array(z.string()).optional(), detectedDomains: z.array(z.string()).optional(), detectedLanguages: z.array(z.string()).optional(), detectedProductCategories: z.array(z.number().int()).optional(), detectedSensitiveCategories: z.array(z.number().int()).optional(), detectedVendorIds: z.array(z.number().int()).optional(), lastStatusUpdate: z.string().optional(), networkPolicyCompliance: policyCompliance.optional(), platformPolicyCompliance: policyCompliance.optional(), russiaPolicyCompliance: policyCompliance.optional()}); export const htmlContent = z.object({height: z.number().int().optional(), snippet: z.string().optional(), width: z.number().int().optional()}); export const image = z.object({height: z.number().int().optional(), url: z.string().optional(), width: z.number().int().optional()}); export const nativeContent = z.object({advertiserName: z.string().optional(), appIcon: image.optional(), body: z.string().optional(), callToAction: z.string().optional(), clickLinkUrl: z.string().optional(), clickTrackingUrl: z.string().optional(), headline: z.string().optional(), image: image.optional(), logo: image.optional(), priceDisplayText: z.string().optional(), starRating: z.number().optional(), videoUrl: z.string().optional(), videoVastXml: z.string().optional()}); export const mediaFile = z.object({bitrate: z.string().optional(), mimeType: z.enum(["VIDEO_MIME_TYPE_UNSPECIFIED", "MIME_VIDEO_XFLV", "MIME_VIDEO_WEBM", "MIME_VIDEO_MP4", "MIME_VIDEO_OGG", "MIME_VIDEO_YT_HOSTED", "MIME_VIDEO_X_MS_WMV", "MIME_VIDEO_3GPP", "MIME_VIDEO_MOV", "MIME_APPLICATION_SWF", "MIME_APPLICATION_SURVEY", "MIME_APPLICATION_JAVASCRIPT", "MIME_APPLICATION_SILVERLIGHT", "MIME_APPLICATION_MPEGURL", "MIME_APPLICATION_MPEGDASH", "MIME_AUDIO_MP4A", "MIME_AUDIO_MP3", "MIME_AUDIO_OGG"]).optional()}); export const videoMetadata = z.object({duration: z.string().optional(), isValidVast: z.boolean().optional(), isVpaid: z.boolean().optional(), mediaFiles: z.array(mediaFile).optional(), skipOffset: z.string().optional(), vastVersion: z.enum(["VAST_VERSION_UNSPECIFIED", "VAST_VERSION_1_0", "VAST_VERSION_2_0", "VAST_VERSION_3_0", "VAST_VERSION_4_0"]).optional()}); export const videoContent = z.object({videoMetadata: videoMetadata.optional(), videoUrl: z.string().optional(), videoVastXml: z.string().optional()}); export const creative = z.object({accountId: z.string().optional(), adChoicesDestinationUrl: z.string().optional(), advertiserName: z.string().optional(), agencyId: z.string().optional(), apiUpdateTime: z.string().optional(), creativeFormat: z.enum(["CREATIVE_FORMAT_UNSPECIFIED", "HTML", "VIDEO", "NATIVE"]).optional(), creativeId: z.string().optional(), creativeServingDecision: creativeServingDecision.optional(), dealIds: z.array(z.string()).optional(), declaredAttributes: z.array(z.enum(["ATTRIBUTE_UNSPECIFIED", "IMAGE_RICH_MEDIA", "ADOBE_FLASH_FLV", "IS_TAGGED", "IS_COOKIE_TARGETED", "IS_USER_INTEREST_TARGETED", "EXPANDING_DIRECTION_NONE", "EXPANDING_DIRECTION_UP", "EXPANDING_DIRECTION_DOWN", "EXPANDING_DIRECTION_LEFT", "EXPANDING_DIRECTION_RIGHT", "EXPANDING_DIRECTION_UP_LEFT", "EXPANDING_DIRECTION_UP_RIGHT", "EXPANDING_DIRECTION_DOWN_LEFT", "EXPANDING_DIRECTION_DOWN_RIGHT", "CREATIVE_TYPE_HTML", "CREATIVE_TYPE_VAST_VIDEO", "EXPANDING_DIRECTION_UP_OR_DOWN", "EXPANDING_DIRECTION_LEFT_OR_RIGHT", "EXPANDING_DIRECTION_ANY_DIAGONAL", "EXPANDING_ACTION_ROLLOVER_TO_EXPAND", "INSTREAM_VAST_VIDEO_TYPE_VPAID_FLASH", "RICH_MEDIA_CAPABILITY_TYPE_MRAID", "RICH_MEDIA_CAPABILITY_TYPE_FLASH", "RICH_MEDIA_CAPABILITY_TYPE_HTML5", "SKIPPABLE_INSTREAM_VIDEO", "RICH_MEDIA_CAPABILITY_TYPE_SSL", "RICH_MEDIA_CAPABILITY_TYPE_NON_SSL", "RICH_MEDIA_CAPABILITY_TYPE_INTERSTITIAL", "NON_SKIPPABLE_INSTREAM_VIDEO", "NATIVE_ELIGIBILITY_ELIGIBLE", "NON_VPAID", "NATIVE_ELIGIBILITY_NOT_ELIGIBLE", "ANY_INTERSTITIAL", "NON_INTERSTITIAL", "IN_BANNER_VIDEO", "RENDERING_SIZELESS_ADX", "OMSDK_1_0", "RENDERING_PLAYABLE"])).optional(), declaredClickThroughUrls: z.array(z.string()).optional(), declaredRestrictedCategories: z.array(z.enum(["RESTRICTED_CATEGORY_UNSPECIFIED", "ALCOHOL"])).optional(), declaredVendorIds: z.array(z.number().int()).optional(), html: htmlContent.optional(), impressionTrackingUrls: z.array(z.string()).optional(), name: z.string().optional(), native: nativeContent.optional(), renderUrl: z.string().optional(), restrictedCategories: z.array(z.enum(["RESTRICTED_CATEGORY_UNSPECIFIED", "ALCOHOL"])).optional(), version: z.number().int().optional(), video: videoContent.optional()}); export const listCreativesResponse = z.object({creatives: z.array(creative).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 creatives as they are at the time of the initial request. This call may take multiple hours to complete. For large, paginated requests, this method returns a snapshot of creatives at the time of request for the first page. `lastStatusUpdate` and `creativeServingDecision` may be outdated for creatives on sequential pages. We recommend [Google Cloud Pub/Sub](//cloud.google.com/pubsub/docs/overview) to view the latest status. * * GET /v1/bidders/{biddersId}/creatives */ export const getApiV1BiddersBiddersIdCreatives = async (args: GetApiV1BiddersBiddersIdCreativesArgs, options?: GetApiV1BiddersBiddersIdCreativesOptions) => { const {baseUrl = "https://realtimebidding.googleapis.com", fetch: fetchFn = fetch, Oauth2, Oauth2c} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.adCategoryTaxonomyOverride != null) query.append("adCategoryTaxonomyOverride", String(args.adCategoryTaxonomyOverride)) if (args.filter != null) query.append("filter", String(args.filter)) if (args.pageSize != null) query.append("pageSize", String(args.pageSize)) if (args.pageToken != null) query.append("pageToken", String(args.pageToken)) if (args.view != null) query.append("view", String(args.view)) if (Oauth2 !== undefined) headers.set('authorization', `Bearer ${Oauth2}`) if (Oauth2c !== undefined) headers.set('authorization', `Bearer ${Oauth2c}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/bidders/${encodeURIComponent(String(args.biddersId))}/creatives${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(listCreativesResponse, await res.json()) };