import {z} from 'zod' export type GetApiV4AdvertisersAdvertisersIdCreativesArgs = {advertisersId: string, filter?: string | undefined, orderBy?: string | undefined, pageSize?: number | undefined, pageToken?: string | undefined}; export type GetApiV4AdvertisersAdvertisersIdCreativesOptions = {baseUrl?: string | undefined, Oauth2?: string | undefined, Oauth2c?: string | undefined, fetch?: typeof fetch | undefined}; export const dimensions = z.object({heightPixels: z.number().int().optional(), widthPixels: z.number().int().optional()}); export const asset = z.object({content: z.string().optional(), mediaId: z.string().optional()}); export const assetAssociation = z.object({asset: asset.optional(), role: z.enum(["ASSET_ROLE_UNSPECIFIED", "ASSET_ROLE_MAIN", "ASSET_ROLE_BACKUP", "ASSET_ROLE_POLITE_LOAD", "ASSET_ROLE_HEADLINE", "ASSET_ROLE_LONG_HEADLINE", "ASSET_ROLE_BODY", "ASSET_ROLE_LONG_BODY", "ASSET_ROLE_CAPTION_URL", "ASSET_ROLE_CALL_TO_ACTION", "ASSET_ROLE_ADVERTISER_NAME", "ASSET_ROLE_PRICE", "ASSET_ROLE_ANDROID_APP_ID", "ASSET_ROLE_IOS_APP_ID", "ASSET_ROLE_RATING", "ASSET_ROLE_ICON", "ASSET_ROLE_COVER_IMAGE", "ASSET_ROLE_BACKGROUND_COLOR", "ASSET_ROLE_ACCENT_COLOR", "ASSET_ROLE_REQUIRE_LOGO", "ASSET_ROLE_REQUIRE_IMAGE", "ASSET_ROLE_ENABLE_ASSET_ENHANCEMENTS"]).optional()}); export const cmTrackingAd = z.object({cmAdId: z.string().optional(), cmCreativeId: z.string().optional(), cmPlacementId: z.string().optional()}); export const counterEvent = z.object({name: z.string().optional(), reportingName: z.string().optional()}); export const exitEvent = z.object({name: z.string().optional(), reportingName: z.string().optional(), type: z.enum(["EXIT_EVENT_TYPE_UNSPECIFIED", "EXIT_EVENT_TYPE_DEFAULT", "EXIT_EVENT_TYPE_BACKUP"]).optional(), url: z.string().optional()}); export const obaIcon = z.object({clickTrackingUrl: z.string().optional(), dimensions: dimensions.optional(), landingPageUrl: z.string().optional(), position: z.enum(["OBA_ICON_POSITION_UNSPECIFIED", "OBA_ICON_POSITION_UPPER_RIGHT", "OBA_ICON_POSITION_UPPER_LEFT", "OBA_ICON_POSITION_LOWER_RIGHT", "OBA_ICON_POSITION_LOWER_LEFT"]).optional(), program: z.string().optional(), resourceMimeType: z.string().optional(), resourceUrl: z.string().optional(), viewTrackingUrl: z.string().optional()}); export const audioVideoOffset = z.object({percentage: z.string().optional(), seconds: z.string().optional()}); export const exchangeReviewStatus = z.object({exchange: z.enum(["EXCHANGE_UNSPECIFIED", "EXCHANGE_GOOGLE_AD_MANAGER", "EXCHANGE_APPNEXUS", "EXCHANGE_BRIGHTROLL", "EXCHANGE_ADFORM", "EXCHANGE_ADMETA", "EXCHANGE_ADMIXER", "EXCHANGE_ADSMOGO", "EXCHANGE_ADSWIZZ", "EXCHANGE_BIDSWITCH", "EXCHANGE_BRIGHTROLL_DISPLAY", "EXCHANGE_CADREON", "EXCHANGE_DAILYMOTION", "EXCHANGE_FIVE", "EXCHANGE_FLUCT", "EXCHANGE_FREEWHEEL", "EXCHANGE_GENIEE", "EXCHANGE_GUMGUM", "EXCHANGE_IMOBILE", "EXCHANGE_IBILLBOARD", "EXCHANGE_IMPROVE_DIGITAL", "EXCHANGE_INDEX", "EXCHANGE_KARGO", "EXCHANGE_MICROAD", "EXCHANGE_MOPUB", "EXCHANGE_NEND", "EXCHANGE_ONE_BY_AOL_DISPLAY", "EXCHANGE_ONE_BY_AOL_MOBILE", "EXCHANGE_ONE_BY_AOL_VIDEO", "EXCHANGE_OOYALA", "EXCHANGE_OPENX", "EXCHANGE_PERMODO", "EXCHANGE_PLATFORMONE", "EXCHANGE_PLATFORMID", "EXCHANGE_PUBMATIC", "EXCHANGE_PULSEPOINT", "EXCHANGE_REVENUEMAX", "EXCHANGE_RUBICON", "EXCHANGE_SMARTCLIP", "EXCHANGE_SMARTRTB", "EXCHANGE_SMARTSTREAMTV", "EXCHANGE_SOVRN", "EXCHANGE_SPOTXCHANGE", "EXCHANGE_STROER", "EXCHANGE_TEADSTV", "EXCHANGE_TELARIA", "EXCHANGE_TVN", "EXCHANGE_UNITED", "EXCHANGE_YIELDLAB", "EXCHANGE_YIELDMO", "EXCHANGE_UNRULYX", "EXCHANGE_OPEN8", "EXCHANGE_TRITON", "EXCHANGE_TRIPLELIFT", "EXCHANGE_TABOOLA", "EXCHANGE_INMOBI", "EXCHANGE_SMAATO", "EXCHANGE_AJA", "EXCHANGE_SUPERSHIP", "EXCHANGE_NEXSTAR_DIGITAL", "EXCHANGE_WAZE", "EXCHANGE_SOUNDCAST", "EXCHANGE_SHARETHROUGH", "EXCHANGE_FYBER", "EXCHANGE_RED_FOR_PUBLISHERS", "EXCHANGE_MEDIANET", "EXCHANGE_TAPJOY", "EXCHANGE_VISTAR", "EXCHANGE_DAX", "EXCHANGE_JCD", "EXCHANGE_PLACE_EXCHANGE", "EXCHANGE_APPLOVIN", "EXCHANGE_CONNATIX", "EXCHANGE_RESET_DIGITAL", "EXCHANGE_HIVESTACK", "EXCHANGE_DRAX", "EXCHANGE_APPLOVIN_GBID", "EXCHANGE_FYBER_GBID", "EXCHANGE_UNITY_GBID", "EXCHANGE_CHARTBOOST_GBID", "EXCHANGE_ADMOST_GBID", "EXCHANGE_TOPON_GBID", "EXCHANGE_NETFLIX", "EXCHANGE_CORE", "EXCHANGE_COMMERCE_GRID", "EXCHANGE_SPOTIFY", "EXCHANGE_TUBI", "EXCHANGE_SNAP", "EXCHANGE_CADENT", "EXCHANGE_EXTE"]).optional(), status: z.enum(["REVIEW_STATUS_UNSPECIFIED", "REVIEW_STATUS_APPROVED", "REVIEW_STATUS_REJECTED", "REVIEW_STATUS_PENDING"]).optional()}); export const reviewStatusInfo = z.object({approvalStatus: z.enum(["APPROVAL_STATUS_UNSPECIFIED", "APPROVAL_STATUS_PENDING_NOT_SERVABLE", "APPROVAL_STATUS_PENDING_SERVABLE", "APPROVAL_STATUS_APPROVED_SERVABLE", "APPROVAL_STATUS_REJECTED_NOT_SERVABLE"]).optional(), contentAndPolicyReviewStatus: z.enum(["REVIEW_STATUS_UNSPECIFIED", "REVIEW_STATUS_APPROVED", "REVIEW_STATUS_REJECTED", "REVIEW_STATUS_PENDING"]).optional(), creativeAndLandingPageReviewStatus: z.enum(["REVIEW_STATUS_UNSPECIFIED", "REVIEW_STATUS_APPROVED", "REVIEW_STATUS_REJECTED", "REVIEW_STATUS_PENDING"]).optional(), exchangeReviewStatuses: z.array(exchangeReviewStatus).optional()}); export const thirdPartyUrl = z.object({type: z.enum(["THIRD_PARTY_URL_TYPE_UNSPECIFIED", "THIRD_PARTY_URL_TYPE_IMPRESSION", "THIRD_PARTY_URL_TYPE_CLICK_TRACKING", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_START", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_FIRST_QUARTILE", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_MIDPOINT", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_THIRD_QUARTILE", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_COMPLETE", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_MUTE", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_PAUSE", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_REWIND", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_FULLSCREEN", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_STOP", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_CUSTOM", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_SKIP", "THIRD_PARTY_URL_TYPE_AUDIO_VIDEO_PROGRESS"]).optional(), url: z.string().optional()}); export const timerEvent = z.object({name: z.string().optional(), reportingName: z.string().optional()}); export const transcode = z.object({audioBitRateKbps: z.string().optional(), audioSampleRateHz: z.string().optional(), bitRateKbps: z.string().optional(), dimensions: dimensions.optional(), fileSizeBytes: z.string().optional(), frameRate: z.number().optional(), mimeType: z.string().optional(), name: z.string().optional(), transcoded: z.boolean().optional()}); export const universalAdId = z.object({id: z.string().optional(), registry: z.enum(["UNIVERSAL_AD_REGISTRY_UNSPECIFIED", "UNIVERSAL_AD_REGISTRY_OTHER", "UNIVERSAL_AD_REGISTRY_AD_ID", "UNIVERSAL_AD_REGISTRY_CLEARCAST", "UNIVERSAL_AD_REGISTRY_DV360", "UNIVERSAL_AD_REGISTRY_CM"]).optional()}); export const creative = z.object({additionalDimensions: z.array(dimensions).optional(), advertiserId: z.string().optional(), appendedTag: z.string().optional(), assets: z.array(assetAssociation).optional(), cmPlacementId: z.string().optional(), cmTrackingAd: cmTrackingAd.optional(), companionCreativeIds: z.array(z.string()).optional(), counterEvents: z.array(counterEvent).optional(), createTime: z.string().optional(), creativeAttributes: z.array(z.enum(["CREATIVE_ATTRIBUTE_UNSPECIFIED", "CREATIVE_ATTRIBUTE_VAST", "CREATIVE_ATTRIBUTE_VPAID_LINEAR", "CREATIVE_ATTRIBUTE_VPAID_NON_LINEAR"])).optional(), creativeId: z.string().optional(), creativeType: z.enum(["CREATIVE_TYPE_UNSPECIFIED", "CREATIVE_TYPE_STANDARD", "CREATIVE_TYPE_EXPANDABLE", "CREATIVE_TYPE_VIDEO", "CREATIVE_TYPE_NATIVE", "CREATIVE_TYPE_TEMPLATED_APP_INSTALL", "CREATIVE_TYPE_NATIVE_SITE_SQUARE", "CREATIVE_TYPE_TEMPLATED_APP_INSTALL_INTERSTITIAL", "CREATIVE_TYPE_LIGHTBOX", "CREATIVE_TYPE_NATIVE_APP_INSTALL", "CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE", "CREATIVE_TYPE_AUDIO", "CREATIVE_TYPE_PUBLISHER_HOSTED", "CREATIVE_TYPE_NATIVE_VIDEO", "CREATIVE_TYPE_TEMPLATED_APP_INSTALL_VIDEO", "CREATIVE_TYPE_ASSET_BASED_CREATIVE"]).optional(), dimensions: dimensions.optional(), displayName: z.string().optional(), dynamic: z.boolean().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(), exitEvents: z.array(exitEvent).optional(), expandOnHover: z.boolean().optional(), expandingDirection: z.enum(["EXPANDING_DIRECTION_UNSPECIFIED", "EXPANDING_DIRECTION_NONE", "EXPANDING_DIRECTION_UP", "EXPANDING_DIRECTION_DOWN", "EXPANDING_DIRECTION_LEFT", "EXPANDING_DIRECTION_RIGHT", "EXPANDING_DIRECTION_UP_AND_LEFT", "EXPANDING_DIRECTION_UP_AND_RIGHT", "EXPANDING_DIRECTION_DOWN_AND_LEFT", "EXPANDING_DIRECTION_DOWN_AND_RIGHT", "EXPANDING_DIRECTION_UP_OR_DOWN", "EXPANDING_DIRECTION_LEFT_OR_RIGHT", "EXPANDING_DIRECTION_ANY_DIAGONAL"]).optional(), hostingSource: z.enum(["HOSTING_SOURCE_UNSPECIFIED", "HOSTING_SOURCE_CM", "HOSTING_SOURCE_THIRD_PARTY", "HOSTING_SOURCE_HOSTED", "HOSTING_SOURCE_RICH_MEDIA"]).optional(), html5Video: z.boolean().optional(), iasCampaignMonitoring: z.boolean().optional(), integrationCode: z.string().optional(), jsTrackerUrl: z.string().optional(), lineItemIds: z.array(z.string()).optional(), mediaDuration: z.string().optional(), mp3Audio: z.boolean().optional(), name: z.string().optional(), notes: z.string().optional(), obaIcon: obaIcon.optional(), oggAudio: z.boolean().optional(), progressOffset: audioVideoOffset.optional(), requireHtml5: z.boolean().optional(), requireMraid: z.boolean().optional(), requirePingForAttribution: z.boolean().optional(), reviewStatus: reviewStatusInfo.optional(), skipOffset: audioVideoOffset.optional(), skippable: z.boolean().optional(), syntheticContentAttestationStatus: z.enum(["SYNTHETIC_CONTENT_ATTESTATION_STATUS_UNSPECIFIED", "NOT_SYNTHETIC", "IS_SYNTHETIC"]).optional(), thirdPartyTag: z.string().optional(), thirdPartyUrls: z.array(thirdPartyUrl).optional(), timerEvents: z.array(timerEvent).optional(), trackerUrls: z.array(z.string()).optional(), transcodes: z.array(transcode).optional(), universalAdId: universalAdId.optional(), updateTime: z.string().optional(), vastTagUrl: z.string().optional(), vpaid: z.boolean().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 in an advertiser. The order is defined by the order_by parameter. If a filter by entity_status is not specified, creatives with `ENTITY_STATUS_ARCHIVED` will not be included in the results. * * GET /v4/advertisers/{advertisersId}/creatives */ export const getApiV4AdvertisersAdvertisersIdCreatives = async (args: GetApiV4AdvertisersAdvertisersIdCreativesArgs, options?: GetApiV4AdvertisersAdvertisersIdCreativesOptions) => { 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))}/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()) };