import {z} from 'zod' export type CreateApiStrategiesStrategyIdCopyArgs = {strategy_id: number, body: {status: boolean, name: string, campaign_id?: number | undefined, copy_strategy_group?: boolean | undefined, strategy_group_id?: number | undefined, duration?: ({start_date?: string | undefined, copy_use_campaign_start?: boolean | undefined, end_date?: string | undefined, copy_use_campaign_end?: boolean | undefined}) | undefined, targeting?: ({copy_geofence?: boolean | undefined, copy_contextual?: boolean | undefined, copy_audience?: boolean | undefined, copy_technology?: boolean | undefined, copy_my_data?: boolean | undefined, copy_location?: boolean | undefined, copy_day_parts?: boolean | undefined, copy_postal_codes?: boolean | undefined, copy_audio_video?: boolean | undefined, copy_ip_addresses?: boolean | undefined, copy_fold_position?: boolean | undefined}) | undefined, inventory?: ({copy_supply?: boolean | undefined, copy_site_lists?: boolean | undefined, copy_supply_controls?: boolean | undefined}) | undefined, concepts?: ({copy_creative_groups?: boolean | undefined}) | undefined}}; export type CreateApiStrategiesStrategyIdCopyOptions = {baseUrl?: string | undefined, Auth0?: string | undefined, fetch?: typeof fetch | undefined}; export const strategyDuration = 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 strategyBudget = z.object({budget: z.number().nullable().optional(), currency_code: z.string().optional(), margin_pct: z.number().gte(0).lte(9999999.9999).nullable().optional()}); export const strategyFrequency = z.object({frequency_type: z.enum(["even", "asap", "no-limit", "t1-optimized", "frequency_goal"]).optional(), frequency_interval: z.enum(["hour", "day", "week", "month", "not-applicable"]).nullable().optional(), frequency_amount: z.number().int().nullable().optional(), frequency_optimization: z.boolean().optional()}); export const strategyConcepts = z.object({weighting: z.enum(["NONE", "BUDGET", "IMPRESSION"]).optional(), creative_groups: z.array(z.object({concept_id: z.number().int(), percent: z.number().gte(0).lte(100)})).optional()}); export const strategyGoals = 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(9999999.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(9999999.99).nullable().optional(), bid_min_devices: z.number().int().gte(-32768).lte(32767).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(), flat_rate_cpm: z.number().gte(0.01).lte(9999999.99).nullable().optional()}); export const strategyPacing = z.object({impression_pacing_type: z.enum(["even", "asap", "no-limit"]).optional(), impression_pacing_amount: z.number().int().gte(1).nullable().optional(), impression_pacing_interval: z.enum(["hour", "day"]).optional(), pacing_type: z.enum(["even", "asap"]).optional(), pacing_amount: z.number().gte(0.01).lte(9999999.99).optional(), pacing_interval: z.enum(["hour", "day"]).optional(), pacing_optimization_type: z.enum(["monetary", "impression"]).optional(), pacing_optimization_amount: z.number().gte(0).lte(9999999.99).nullable().optional(), use_dba_strategy_pacing: z.enum(["always", "never", "custom"]).optional(), use_dba_strategy_pacing_after_date: z.string().nullable().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 strategyInventory = z.object({supply_type: z.enum(["RTB", "RMX_API", "T1_RMX", "MKT", "BATCH"]).optional(), run_on_all_pmp: z.boolean().optional(), run_on_all_exchanges: z.boolean().optional(), 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(), campaign_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 strategySegmentGroup = z.object({operator: z.literal("AND"), segment_groups: z.array(z.object({segment_group_id: z.number().int().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 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 targetingIpAddressesResponse = z.object({restriction: z.enum(["INCLUDE", "EXCLUDE", ""]).optional(), count: z.number().int().optional()}); export const targetingPostalCodesResponse = z.object({restriction: z.string().optional(), count: z.number().int().optional()}); export const targetingRecencyElementResponse = z.object({pixel_id: z.number().int().optional(), from_hour: z.number().int().optional(), to_hour: z.number().int().optional()}); export const singleMetadata = z.object({status: z.string()}); export const strategy = z.object({data: z.object({inherited_mfa_avoidance: z.enum(["INHERIT", "ALLOW_ALL", "EXCLUDE_MFA"]).optional(), inherited_mfa_from: z.enum(["Organization", "Agency", "Advertiser", "Campaign", "Strategy"]).optional(), campaign_name: z.string().optional(), campaign_start_date: z.string().optional(), campaign_end_date: z.string().optional(), campaign_zone_name: z.string().optional(), campaign_service_type: z.string().optional(), campaign_goal_type: z.string().optional(), campaign_goal_value: z.number().optional(), campaign_merit_pixel_id: z.number().int().nullable().optional(), viewability: z.object({sample_rate: z.number().optional(), type: z.string().optional(), vendor_id: z.number().int().optional()}).optional(), name: z.string().max(128).optional(), description: z.string().max(1024).optional(), status: z.boolean().optional(), archived: z.boolean().optional(), is_programmatic_guaranteed: z.boolean().optional(), media_type: z.enum(["DISPLAY", "VIDEO"]).optional(), use_optimization: z.boolean().optional(), ads_txt_verified: z.enum(["ANY", "AUTHORIZED_ONLY", "AUTHORIZED_DIRECT_ONLY", "NONE"]).nullable().optional(), type: z.enum(["REM", "GBO", "AUD"]).optional(), feature_compatibility: z.string().max(1024).nullable().optional(), device_graph_only: z.boolean().optional(), mfa_avoidance: z.enum(["INHERIT", "ALLOW_ALL", "EXCLUDE_MFA"]).optional(), zone_name: z.string().optional(), created_on: z.string().optional(), updated_on: z.string().optional(), duration: strategyDuration.optional(), budget: strategyBudget.optional(), frequency: strategyFrequency.optional(), concepts: strategyConcepts.optional(), groups: z.array(z.string()).nullable().optional(), strategy_group_id: z.number().int().gte(1).nullable().optional(), entity_type: z.string().optional(), version: z.number().int().optional(), goals: strategyGoals.optional(), pacing: strategyPacing.optional(), inventory: strategyInventory.optional(), id: z.number().int().optional(), campaign_id: z.number().int().optional(), targeting: z.object({fold_position: z.array(z.enum(["ABOVE", "BELOW", "UNCATEGORIZED", "HEADER", "FOOTER", "SIDEBAR", "FULLSCREEN"])).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(), audience_groups: z.object({include: z.array(strategySegmentGroup).optional(), exclude: z.object({}).optional()}).optional(), contextual_groups: z.object({include: z.array(strategySegmentGroup).optional(), exclude: z.object({}).optional()}).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(), day_parts: z.array(dayPart).optional(), language_codes: z.array(z.object({code: z.string().optional(), name: z.string().optional()})).optional(), ip_addresses: targetingIpAddressesResponse.optional(), postal_codes: targetingPostalCodesResponse.optional(), recency: z.array(targetingRecencyElementResponse).optional()}).optional()}).optional(), meta: singleMetadata.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 }; /** * Copy a strategy * * POST /strategies/{strategy_id}/copy */ export const createApiStrategiesStrategyIdCopy = async (args: CreateApiStrategiesStrategyIdCopyArgs, options?: CreateApiStrategiesStrategyIdCopyOptions) => { const {baseUrl = "https://api.mediamath.com/api/v3.0", fetch: fetchFn = fetch, Auth0} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (Auth0 !== undefined) headers.set('authorization', `Bearer ${Auth0}`) const url = `${baseUrl.replace(/\/+$/, '')}/strategies/${encodeURIComponent(String(args.strategy_id))}/copy${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(strategy, await res.json()) };