import {z} from 'zod' export type GetApiV4AdvertisersAdvertisersIdCampaignsArgs = {advertisersId: string, filter?: string | undefined, orderBy?: string | undefined, pageSize?: number | undefined, pageToken?: string | undefined}; export type GetApiV4AdvertisersAdvertisersIdCampaignsOptions = {baseUrl?: string | undefined, Oauth2?: string | undefined, Oauth2c?: string | undefined, fetch?: typeof fetch | undefined}; export const date = z.object({day: z.number().int().optional(), month: z.number().int().optional(), year: z.number().int().optional()}); export const dateRange = z.object({endDate: date.optional(), startDate: date.optional()}); export const prismaCpeCode = z.object({prismaClientCode: z.string().optional(), prismaEstimateCode: z.string().optional(), prismaProductCode: z.string().optional()}); export const prismaConfig = z.object({prismaCpeCode: prismaCpeCode.optional(), prismaType: z.enum(["PRISMA_TYPE_UNSPECIFIED", "PRISMA_TYPE_DISPLAY", "PRISMA_TYPE_SEARCH", "PRISMA_TYPE_VIDEO", "PRISMA_TYPE_AUDIO", "PRISMA_TYPE_SOCIAL", "PRISMA_TYPE_FEE"]).optional(), supplier: z.string().optional()}); export const campaignBudget = z.object({budgetAmountMicros: z.string().optional(), budgetId: z.string().optional(), budgetUnit: z.enum(["BUDGET_UNIT_UNSPECIFIED", "BUDGET_UNIT_CURRENCY", "BUDGET_UNIT_IMPRESSIONS"]).optional(), dateRange: dateRange.optional(), displayName: z.string().optional(), externalBudgetId: z.string().optional(), externalBudgetSource: z.enum(["EXTERNAL_BUDGET_SOURCE_UNSPECIFIED", "EXTERNAL_BUDGET_SOURCE_NONE", "EXTERNAL_BUDGET_SOURCE_MEDIA_OCEAN"]).optional(), invoiceGroupingId: z.string().optional(), prismaConfig: prismaConfig.optional()}); export const campaignFlight = z.object({plannedDates: dateRange.optional(), plannedSpendAmountMicros: z.string().optional()}); export const performanceGoal = z.object({performanceGoalAmountMicros: z.string().optional(), performanceGoalPercentageMicros: z.string().optional(), performanceGoalString: z.string().optional(), performanceGoalType: z.enum(["PERFORMANCE_GOAL_TYPE_UNSPECIFIED", "PERFORMANCE_GOAL_TYPE_CPM", "PERFORMANCE_GOAL_TYPE_CPC", "PERFORMANCE_GOAL_TYPE_CPA", "PERFORMANCE_GOAL_TYPE_CTR", "PERFORMANCE_GOAL_TYPE_VIEWABILITY", "PERFORMANCE_GOAL_TYPE_CPIAVC", "PERFORMANCE_GOAL_TYPE_CPE", "PERFORMANCE_GOAL_TYPE_CPV", "PERFORMANCE_GOAL_TYPE_CLICK_CVR", "PERFORMANCE_GOAL_TYPE_IMPRESSION_CVR", "PERFORMANCE_GOAL_TYPE_VCPM", "PERFORMANCE_GOAL_TYPE_VTR", "PERFORMANCE_GOAL_TYPE_AUDIO_COMPLETION_RATE", "PERFORMANCE_GOAL_TYPE_VIDEO_COMPLETION_RATE", "PERFORMANCE_GOAL_TYPE_OTHER"]).optional()}); export const campaignGoal = z.object({campaignGoalType: z.enum(["CAMPAIGN_GOAL_TYPE_UNSPECIFIED", "CAMPAIGN_GOAL_TYPE_APP_INSTALL", "CAMPAIGN_GOAL_TYPE_BRAND_AWARENESS", "CAMPAIGN_GOAL_TYPE_OFFLINE_ACTION", "CAMPAIGN_GOAL_TYPE_ONLINE_ACTION"]).optional(), performanceGoal: performanceGoal.optional()}); export const frequencyCap = z.object({maxImpressions: z.number().int().optional(), maxViews: z.number().int().optional(), timeUnit: z.enum(["TIME_UNIT_UNSPECIFIED", "TIME_UNIT_LIFETIME", "TIME_UNIT_MONTHS", "TIME_UNIT_WEEKS", "TIME_UNIT_DAYS", "TIME_UNIT_HOURS", "TIME_UNIT_MINUTES"]).optional(), timeUnitCount: z.number().int().optional(), unlimited: z.boolean().optional()}); export const campaign = z.object({advertiserId: z.string().optional(), campaignBudgets: z.array(campaignBudget).optional(), campaignFlight: campaignFlight.optional(), campaignGoal: campaignGoal.optional(), campaignId: z.string().optional(), displayName: z.string().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(), frequencyCap: frequencyCap.optional(), name: z.string().optional(), updateTime: z.string().optional()}); export const listCampaignsResponse = z.object({campaigns: z.array(campaign).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 campaigns in an advertiser. The order is defined by the order_by parameter. If a filter by entity_status is not specified, campaigns with `ENTITY_STATUS_ARCHIVED` will not be included in the results. * * GET /v4/advertisers/{advertisersId}/campaigns * * Also accepts auth: Oauth2 + Oauth2c */ export const getApiV4AdvertisersAdvertisersIdCampaigns = async (args: GetApiV4AdvertisersAdvertisersIdCampaignsArgs, options?: GetApiV4AdvertisersAdvertisersIdCampaignsOptions) => { 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))}/campaigns${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(listCampaignsResponse, await res.json()) };