import {z} from 'zod' export type GetApiNewStrategyPlansStrategyPlanIdArgs = {strategy_plan_id: number, extended?: boolean | undefined}; export type GetApiNewStrategyPlansStrategyPlanIdOptions = {baseUrl?: string | undefined, Auth0?: string | undefined, fetch?: typeof fetch | undefined}; export const strategyPlanDuration = z.object({use_campaign_start: z.boolean().optional(), use_campaign_end: z.boolean().optional(), start_date: z.string().nullable().optional(), end_date: z.string().nullable().optional()}); export const strategyPlanBudget = z.object({budget: z.number().nullable().optional(), currency_code: z.string().optional()}); export const strategyPlanGoals = z.object({goal_type: z.enum(["spend", "reach", "cpc", "cpe", "cpa", "roi", "ctr", "vcr", "viewability_rate", "vcpm", ""]).optional(), goal_value: z.number().gte(0).lte(999999999.9999).optional(), min_bid: z.number().gte(0).lte(9999999.99).optional(), max_bid: z.number().gte(0.01).lte(9999999.99).optional(), roi_target: z.number().gte(0).lte(999999999.99).nullable().optional(), bid_min_devices: z.number().int().nullable().optional(), bid_aggressiveness: z.number().int().gte(0).lte(100).optional(), bid_price_is_media_only: z.boolean().optional(), max_bid_wm: z.number().gte(0).lte(9999999.99).nullable().optional(), use_bid_shading: z.boolean().optional()}); export const strategyPlanFrequency = z.object({frequency_type: z.enum(["even", "asap", "no-limit", "t1-optimized"]).nullable().optional(), frequency_interval: z.enum(["hour", "day", "week", "month", "campaign", "not-applicable"]).optional(), frequency_amount: z.number().int().optional(), frequency_optimization: z.boolean().optional()}); export const domainRestriction = z.object({domain: z.string(), target_type: z.enum(["DOMAIN", "APP"])}); export const siteList = z.object({site_list_id: z.number().int(), assigned: z.boolean()}); export const deal = z.object({deal_id: z.number().int()}); export const dealGroup = z.object({deal_group_id: z.number().int()}); export const supplySource = z.object({supply_source_id: z.number().int()}); export const strategyPlanInventory = z.object({run_on_all_pmp: z.boolean(), run_on_all_exchanges: z.boolean(), site_restriction_transparent_urls: z.boolean().optional(), domain_restrictions: z.object({include: z.array(domainRestriction).optional(), exclude: z.array(domainRestriction).optional()}).optional(), site_lists: z.array(siteList).optional(), deals: z.array(deal).optional(), deal_groups: z.array(dealGroup).optional(), supply_sources: z.array(supplySource).optional()}); export const strategyAudienceSegment = z.object({audience_segment_id: z.number().int(), user_cpm: z.number().nullable().optional()}); export const strategyContextualSegment = z.object({targeting_segment_id: z.number().int(), user_cpm: z.number().nullable().optional()}); export const targetingPostalCodes = z.object({restriction: z.string().optional(), codes: z.array(z.string()).optional()}); export const strategyGeofence = z.object({operator: z.enum(["AND", "OR"]).optional(), segments: z.array(z.object({geofence_segment_id: z.number().int().optional(), geofence_segment_factual_id: z.string().optional(), place_list_id: z.number().int().gte(1).lte(2147483647).optional()})).optional()}); export const strategyMyData = z.object({operator: z.enum(["AND", "OR"]).optional(), pixels: z.array(z.object({pixel_id: z.number().int()}))}); export const strategyLocation = z.object({operator: z.enum(["AND", "OR"]).optional(), target_value_id: z.number().int(), code: z.enum(["DMAX", "REGN", "CITY", "COUNTRY"])}); export const strategyTechnology = z.object({operator: z.enum(["AND", "OR"]).optional(), code: z.enum(["BSER", "CSPD", "DVCE", "ISPX", "OSXX", "INVT", "VPSZ", "VLIN", "VCON", "VAUD", "VSKP", "VPLC", "DVMD", "BRLG", "IPTA", "HYPL"]), target_value_id: z.number().int()}); export const targetingIpAddresses = z.object({restriction: z.enum(["INCLUDE", "EXCLUDE", ""]).optional(), codes: z.array(z.string()).optional()}); export const dayPart = z.object({user_time: z.boolean().optional(), start_hour: z.number().int().gte(0).lte(23), end_hour: z.number().int().gte(0).lte(23), days: z.array(z.enum(["M", "T", "W", "R", "F", "S", "U"]))}); export const strategyPlanTargeting = z.object({fold_position: z.array(z.enum(["ABOVE", "BELOW", "UNCATEGORIZED"])).nullable().optional(), audience: z.object({include: z.array(z.object({operator: z.enum(["AND", "OR"]).optional(), segments: z.array(strategyAudienceSegment).optional()})).optional(), exclude: z.object({operator: z.enum(["AND", "OR"]).optional(), segments: z.array(strategyAudienceSegment).optional()}).optional()}).optional(), contextual: z.object({include: z.array(z.object({code: z.string().optional(), operator: z.enum(["AND", "OR"]).optional(), segments: z.array(strategyContextualSegment).optional()})).optional(), exclude: z.object({code: z.string().optional(), operator: z.enum(["AND", "OR"]).optional(), segments: z.array(strategyContextualSegment)}).optional()}).optional(), postal_codes: targetingPostalCodes.optional(), geofence: z.object({include: strategyGeofence.optional(), exclude: strategyGeofence.optional()}).optional(), my_data: z.object({include: strategyMyData.optional(), exclude: strategyMyData.optional()}).optional(), location: z.object({include: z.array(strategyLocation).optional(), exclude: z.array(strategyLocation).optional()}).optional(), technology: z.object({include: z.array(strategyTechnology).optional(), exclude: z.array(strategyTechnology).optional()}).optional(), ip_addresses: targetingIpAddresses.optional(), day_parts: z.array(dayPart).optional(), recency: z.array(z.object({pixel_id: z.number().int(), from_hour: z.number().int(), to_hour: z.number().int()})).optional(), language_codes: z.array(z.object({code: z.string().optional(), name: z.string().optional()})).optional()}); export const strategyPlanCreatives = z.object({ad_expandable: z.boolean().nullable(), ad_formats: z.array(z.string()).nullable(), ad_sizes: z.array(z.string()).nullable()}); export const newStrategyPlanResponse = z.object({data: z.object({campaign_start_date: z.string().optional(), campaign_end_date: z.string().optional(), campaign_zone_name: z.string().optional(), name: z.string().max(128).optional(), feature_compatibility: z.string().max(1024).optional(), device_graph_only: z.boolean().optional(), zone_name: z.string().optional(), campaign_service_type: z.string().optional(), type: z.string().optional(), duration: strategyPlanDuration.optional(), budget: strategyPlanBudget.optional(), goals: strategyPlanGoals.optional(), frequency: strategyPlanFrequency.optional(), inventory: strategyPlanInventory.optional(), targeting: strategyPlanTargeting.optional(), creatives: strategyPlanCreatives.optional(), id: z.number().int().optional(), version: z.number().int().optional(), campaign_id: z.number().int().optional()}).optional(), meta: z.object({status: z.string().optional()}).optional()}); export const strategyAudienceSegmentExtended = z.object({audience_segment_id: z.number().int(), audience_segment_name: z.string().optional(), cpm: z.number().optional(), user_cpm: z.number().optional(), currency_code: z.string().optional(), full_path: z.string().optional(), size: z.number().int().optional(), vendor_id: z.number().int().optional(), vendor_name: z.string().optional(), code: z.string().optional()}); export const strategyContextualSegmentExtended = z.object({targeting_segment_id: z.number().int(), targeting_segment_name: z.string().optional(), full_path: z.string().optional(), vendor_id: z.number().int().optional(), vendor_name: z.string().optional(), objective_type_id: z.number().int().optional(), objective_type_name: z.string().optional(), retail_cpm: z.number().optional(), user_cpm: z.number().optional(), currency_code: z.string().optional(), external_code: z.string().optional()}); export const targetingPostalCodesResponse = z.object({restriction: z.string().optional(), count: z.number().int().optional()}); export const strategyGeofenceExtended = z.object({operator: z.enum(["AND", "OR"]).optional(), segments: z.array(z.object({geofence_segment_id: z.number().int().optional(), geofence_segment_factual_id: z.string().optional(), place_list_id: z.number().int().optional(), name: z.string().max(128).optional(), status: z.boolean().optional(), updated_on: z.string().optional()})).optional()}); export const strategyMyDataExtended = z.object({operator: z.enum(["AND", "OR"]).optional(), pixels: z.array(z.object({pixel_id: z.number().int(), pixel_name: z.string().optional(), pixel_type: z.enum(["event", "data", "dynamic"]).optional(), owner_type: z.enum(["advertiser", "agency"]).optional(), owner_id: z.number().int().optional(), owner_name: z.string().optional()}))}); export const strategyLocationExtended = z.object({target_value_id: z.number().int(), name: z.string().optional(), full_path: z.string().optional(), code: z.enum(["DMAX", "REGN", "CITY", "COUNTRY"]).optional(), provider_code: z.string().optional(), target_value: z.number().int().optional()}); export const strategyTechnologyExtended = z.object({code: z.enum(["BSER", "CSPD", "DVCE", "ISPX", "OSXX", "INVT", "VPSZ", "VLIN", "VCON", "VAUD", "VSKP", "VPLC", "DVMD", "BRLG", "IPTA", "HYPL"]), target_value_id: z.number().int(), name: z.string().optional(), target_value: z.number().int().optional()}); export const targetingIpAddressesResponse = z.object({restriction: z.enum(["INCLUDE", "EXCLUDE", ""]).optional(), count: z.number().int().optional()}); export const strategyPlanTargetingExtended = z.object({fold_position: z.array(z.enum(["ABOVE", "BELOW", "UNCATEGORIZED"])).nullable().optional(), audience: z.object({include: z.array(z.object({operator: z.enum(["AND", "OR"]).optional(), segments: z.array(strategyAudienceSegmentExtended).optional()})).optional(), exclude: z.object({operator: z.enum(["AND", "OR"]).optional(), segments: z.array(strategyAudienceSegmentExtended).optional()}).optional()}).optional(), contextual: z.object({include: z.array(z.object({code: z.string().optional(), operator: z.enum(["AND", "OR"]).optional(), segments: z.array(strategyContextualSegmentExtended).optional()})).optional(), exclude: z.object({code: z.string().optional(), operator: z.enum(["AND", "OR"]).optional(), segments: z.array(strategyContextualSegmentExtended)}).optional()}).optional(), postal_codes: targetingPostalCodesResponse.optional(), geofence: z.object({include: strategyGeofenceExtended.optional(), exclude: strategyGeofenceExtended.optional()}).optional(), my_data: z.object({include: strategyMyDataExtended.optional(), exclude: strategyMyDataExtended.optional()}).optional(), location: z.object({include: z.array(strategyLocationExtended).optional(), exclude: z.array(strategyLocationExtended).optional()}).optional(), technology: z.object({include: z.array(strategyTechnologyExtended).optional(), exclude: z.array(strategyTechnologyExtended).optional()}).optional(), ip_addresses: targetingIpAddressesResponse.optional(), day_parts: z.array(dayPart).optional(), recency: z.array(z.object({pixel_id: z.number().int(), from_hour: z.number().int(), to_hour: z.number().int()})).optional(), language_codes: z.array(z.object({code: z.string().optional(), name: z.string().optional()})).optional()}); export const newStrategyPlanResponseExtended = z.object({data: z.object({campaign_start_date: z.string().optional(), campaign_end_date: z.string().optional(), campaign_zone_name: z.string().optional(), name: z.string().max(128).optional(), feature_compatibility: z.string().max(1024).optional(), device_graph_only: z.boolean().optional(), zone_name: z.string().optional(), campaign_service_type: z.string().optional(), type: z.string().optional(), duration: strategyPlanDuration.optional(), budget: strategyPlanBudget.optional(), goals: strategyPlanGoals.optional(), frequency: strategyPlanFrequency.optional(), inventory: strategyPlanInventory.optional(), targeting: strategyPlanTargetingExtended.optional(), creatives: strategyPlanCreatives.optional(), id: z.number().int().optional(), version: z.number().int().optional(), campaign_id: z.number().int().optional()}).optional(), meta: z.object({status: z.string().optional()}).optional()}); export const getApiNewStrategyPlansStrategyPlanIdResponse = z.union([newStrategyPlanResponse, newStrategyPlanResponseExtended]); 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 }; /** * Get a New Strategy Plan * * GET /new_strategy_plans/{strategy_plan_id} */ export const getApiNewStrategyPlansStrategyPlanId = async (args: GetApiNewStrategyPlansStrategyPlanIdArgs, options?: GetApiNewStrategyPlansStrategyPlanIdOptions) => { const {baseUrl = "https://api.mediamath.com/api/v3.0", fetch: fetchFn = fetch, Auth0} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.extended != null) query.append("extended", String(args.extended)) if (Auth0 !== undefined) headers.set('authorization', `Bearer ${Auth0}`) const url = `${baseUrl.replace(/\/+$/, '')}/new_strategy_plans/${encodeURIComponent(String(args.strategy_plan_id))}${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(getApiNewStrategyPlansStrategyPlanIdResponse, await res.json()) };