import {z} from 'zod' export type GetApiStrategiesStrategyIdArgs = {strategy_id: number, extended?: boolean | undefined}; export type GetApiStrategiesStrategyIdOptions = {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 siteListExtended = z.object({site_list_id: z.number().int(), name: z.string().optional(), status: z.boolean().optional(), restriction: z.enum(["INCLUDE", "EXCLUDE"]).optional(), sites_count: z.number().int().optional(), sites_count_domain: z.number().int().optional(), sites_count_app: z.number().int().optional(), sites_count_primary_seller_id: z.number().int().optional(), content_updated_on: z.string().optional(), assigned: z.boolean()}); export const supplySourceExtended = z.object({supply_source_id: z.number().int(), name: z.string().optional(), rtb_type: z.enum(["STANDARD", "MARKETPLACE"]).optional()}); export const strategyInventoryExtended = 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(siteListExtended).optional(), campaign_site_lists: z.array(siteListExtended).optional(), deals: z.array(deal).optional(), deal_groups: z.array(dealGroup).optional(), supply_sources: z.array(supplySourceExtended).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 strategySegmentGroupExtended = z.object({operator: z.literal("AND").optional(), segment_groups: z.array(z.object({segment_group_id: z.number().int().optional(), segment_group_name: z.string().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 strategyTargetingExtended = 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(strategyAudienceSegmentExtended).optional()})).optional(), exclude: z.object({segments: z.array(strategyAudienceSegmentExtended).optional()}).optional(), retired: z.array(z.number().int()).optional()}).optional(), contextual: z.object({include: z.array(z.object({operator: z.enum(["AND", "OR"]).optional(), segments: z.array(strategyContextualSegmentExtended).optional()})).optional(), exclude: z.object({segments: z.array(strategyContextualSegmentExtended)}).optional(), retired: z.array(z.number().int()).optional()}).optional(), audience_groups: z.object({include: z.array(strategySegmentGroupExtended).optional(), exclude: z.object({}).optional()}).optional(), contextual_groups: z.object({include: z.array(strategySegmentGroupExtended).optional(), exclude: z.object({}).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().optional(), from_hour: z.number().int().optional(), to_hour: z.number().int()})).optional(), language_codes: z.array(z.object({code: z.string().optional(), name: z.string().optional()})).optional()}); export const strategyConceptsExtended = 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), name: z.string().max(128).optional(), status: z.boolean().optional(), created_on: z.string().nullable().optional(), start_date: z.string().nullable().optional(), assigned_creatives_count: z.number().int().gte(0).optional()})).optional()}); export const strategyExtended = 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(), 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(), 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(), id: z.number().int().optional(), version: z.number().int().optional(), advertiser_id: z.number().int().optional(), strategy_group_name: z.string().optional(), duration: strategyDuration.optional(), budget: strategyBudget.optional(), pacing: strategyPacing.optional(), goals: strategyGoals.optional(), frequency: strategyFrequency.optional(), inventory: strategyInventoryExtended.optional(), targeting: strategyTargetingExtended.optional(), concepts: strategyConceptsExtended.optional()}).optional(), meta: singleMetadata.optional()}); export const getApiStrategiesStrategyIdResponse = z.union([strategy, strategyExtended]); 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 Strategy * * GET /strategies/{strategy_id} */ export const getApiStrategiesStrategyId = async (args: GetApiStrategiesStrategyIdArgs, options?: GetApiStrategiesStrategyIdOptions) => { 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(/\/+$/, '')}/strategies/${encodeURIComponent(String(args.strategy_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(getApiStrategiesStrategyIdResponse, await res.json()) };