import {z} from 'zod' export type GetApiCmV1CampaignsArgs = {ad_account_id: string, product_id?: string | undefined, states?: (Array<'UNKNOWN_CAMPAIGN_STATE' | 'SUBMITTED' | 'READY' | 'UPCOMING' | 'ACTIVE' | 'PAUSED' | 'SUSPENDED' | 'COMPLETED' | 'LEARNING'>) | undefined, fetch_option?: ('UNKNOWN_FETCH_OPTION' | 'FETCH_ALL' | 'FETCH_ONLY_DELETED') | undefined}; export type GetApiCmV1CampaignsOptions = {baseUrl?: string | undefined, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const commonEnablingState = z.enum(["UNSPECIFIED", "ENABLED", "DISABLED"]); export const dspCampaignType = z.enum(["UNKNOWN_CAMPAIGN_TYPE", "GENERIC", "APP_USER_ACQUISITION", "APP_REENGAGEMENT", "WEBSITE_VISIT", "CTV_GENERIC", "CTV_APP_USER_ACQUISITION", "WEB_USER_ACQUISITION", "CTV_WEBSITE_VISIT", "CTV_WEB_USER_ACQUISITION", "WEB_RETARGETING"]); export const commonDeviceOs = z.enum(["UNKNOWN_DEVICE_OS", "ANDROID", "IOS", "VERSATILE", "MOBILE_WEB", "MACOS", "WINDOWS", "NEXT_VERSATILE"]); export const dspCampaignState = z.enum(["UNKNOWN_CAMPAIGN_STATE", "SUBMITTED", "READY", "UPCOMING", "ACTIVE", "PAUSED", "SUSPENDED", "COMPLETED", "LEARNING"]); export const adcloudcommonCurrency = z.enum(["UNKNOWN_CURRENCY", "USD", "KRW", "JPY", "EUR", "GBP"]); export const commonTimeInterval = z.object({start: z.string().optional(), end: z.string().optional()}); export const adcloudcommonMoney = z.object({currency: adcloudcommonCurrency.optional(), amount_micros: z.string().optional()}); export const dspDailyBudgetSchedule = z.object({daily_budget: adcloudcommonMoney.optional()}); export const dspDayOfWeekBudgetSchedule = z.object({monday_budget: adcloudcommonMoney.optional(), tuesday_budget: adcloudcommonMoney.optional(), wednesday_budget: adcloudcommonMoney.optional(), thursday_budget: adcloudcommonMoney.optional(), friday_budget: adcloudcommonMoney.optional(), saturday_budget: adcloudcommonMoney.optional(), sunday_budget: adcloudcommonMoney.optional()}); export const dspWeeklyFlexibleBudgetSchedule = z.object({weekly_budget: adcloudcommonMoney.optional()}); export const dspBudgetSchedule = z.object({daily_schedule: dspDailyBudgetSchedule.optional(), weekly_schedule: dspDayOfWeekBudgetSchedule.optional(), weekly_flexible_schedule: dspWeeklyFlexibleBudgetSchedule.optional()}); export const adcloudcommonTrackingCompany = z.enum(["UNKNOWN_TRACKING_COMPANY", "KOCHAVA", "ADJUST", "MAT", "MOLOCO_PIXEL", "APPSFLYER", "ADBRIX", "WEB", "GENERIC", "TRACKFNT", "AIRBRIDGE", "MOLOCO_E2E", "APSALAR", "BRANCH", "TENJIN", "SINGULAR", "ADBRIX_V2", "TRAFFICGUARD", "GAMELOFT", "SKADNETWORK", "MYTRACKER", "MOLOCO_RMP", "MOLOCO_PIXEL_V2", "JUSTTRACK", "SHOPEE", "KOCHAVA_FOR_PUBLISHER", "GAMESIGHT", "CAULY", "HASOFFER", "ADACTION", "CURATE"]); export const dspCampaignGoalType = z.enum(["UNKNOWN_TYPE", "OPTIMIZE_NONE", "FIXED_CPM_FOR_APP_UA", "FIXED_CPM_FOR_APP_RE", "OPTIMIZE_CPI_FOR_APP_UA", "OPTIMIZE_CPA_FOR_APP_UA", "OPTIMIZE_CPC_FOR_APP_UA", "OPTIMIZE_ROAS_FOR_APP_UA", "OPTIMIZE_ROAS_FOR_APP_RE", "OPTIMIZE_CPC_FOR_APP_RE", "OPTIMIZE_CPC_FOR_WEB_VISIT", "OPTIMIZE_APP_INSTALLS", "OPTIMIZE_APP_ROAS", "OPTIMIZE_CLICKS_TO_WEB", "OPTIMIZE_CLICKS_TO_APP", "OPTIMIZE_CPA_FOR_APP_RE", "OPTIMIZE_RETENTION_FOR_APP_UA", "OPTIMIZE_REATTRIBUTION_FOR_APP", "OPTIMIZE_CPA_REPEATED_FOR_APP_UA", "FIXED_CPM_GENERIC", "FIXED_CPM_FOR_CTV", "FIXED_CPM_FOR_WEB_VISIT", "OPTIMIZE_LANDING_FOR_WEB_UA", "OPTIMIZE_CPA_FOR_WEB_UA"]); export const campaignGoalOptimizeAppInstallsMode = z.enum(["UNKNOWN_MODE", "TARGET_CPI_CENTRIC", "BUDGET_CENTRIC", "MARGIN_CENTRIC", "FIXED"]); export const campaignGoalOptimizeAppInstalls = z.object({mode: campaignGoalOptimizeAppInstallsMode.optional(), target_cpi: adcloudcommonMoney.optional(), rate: z.number().optional(), margin: z.number().optional()}); export const campaignGoalOptimizeCpaForAppUaMode = z.enum(["UNKNOWN_MODE", "BUDGET_CENTRIC", "MARGIN_CENTRIC", "TARGET_PRIMARY_KPI_CENTRIC"]); export const campaignGoalOptimizeCpaForAppUa = z.object({action: z.string(), mode: campaignGoalOptimizeCpaForAppUaMode.optional(), rate: z.number().optional(), margin: z.number().optional(), target_kpi: adcloudcommonMoney.optional()}); export const campaignGoalOptimizeAppRoasMode = z.enum(["UNKNOWN_MODE", "BUDGET_CENTRIC", "MARGIN_CENTRIC", "TARGET_PRIMARY_KPI_CENTRIC"]); export const campaignGoalOptimizeAppRoas = z.object({target_roas: z.number().optional(), revenue_actions: z.array(z.string()), target_cpi: adcloudcommonMoney.optional(), mode: campaignGoalOptimizeAppRoasMode.optional(), rate: z.number().optional(), margin: z.number().optional()}); export const campaignGoalOptimizeClicksToWebMode = z.enum(["UNKNOWN_MODE", "BUDGET_CENTRIC", "TARGET_CPC_CENTRIC"]); export const campaignGoalOptimizeClicksToWeb = z.object({target_cpc: adcloudcommonMoney.optional(), mode: campaignGoalOptimizeClicksToWebMode.optional(), rate: z.number().optional()}); export const campaignGoalOptimizeClicksToAppMode = z.enum(["UNKNOWN_MODE", "BUDGET_CENTRIC", "TARGET_CPC_CENTRIC"]); export const campaignGoalOptimizeClicksToApp = z.object({target_cpc: adcloudcommonMoney.optional(), mode: campaignGoalOptimizeClicksToAppMode.optional(), rate: z.number().optional()}); export const campaignGoalOptimizeRoasForAppRe = z.object({target_roas: z.number().optional(), reengagement_action: z.string().optional(), revenue_actions: z.array(z.string()), rate: z.number().optional()}); export const campaignGoalOptimizeCpcForAppReMode = z.enum(["UNKNOWN_MODE", "BUDGET_CENTRIC", "TARGET_CPC_CENTRIC"]); export const campaignGoalOptimizeCpcForAppRe = z.object({target_cpc: adcloudcommonMoney.optional(), reengagement_action: z.string().optional(), mode: campaignGoalOptimizeCpcForAppReMode.optional(), rate: z.number().optional()}); export const campaignGoalOptimizeFixedCpm = z.object({target_cpm: adcloudcommonMoney}); export const campaignGoalOptimizeCpaForAppReMode = z.enum(["UNKNOWN_MODE", "BUDGET_CENTRIC"]); export const campaignGoalOptimizeCpaForAppRe = z.object({action: z.string(), reengagement_action: z.string().optional(), mode: campaignGoalOptimizeCpaForAppReMode.optional(), rate: z.number().optional()}); export const campaignGoalOptimizeAppRetentionMode = z.enum(["UNKNOWN_MODE", "BUDGET_CENTRIC", "MARGIN_CENTRIC"]); export const campaignGoalOptimizeAppRetention = z.object({mode: campaignGoalOptimizeAppRetentionMode.optional(), target_cpi: adcloudcommonMoney.optional(), rate: z.number().optional(), margin: z.number().optional()}); export const campaignGoalOptimizeAppReattributionMode = z.enum(["UNKNOWN_MODE", "BUDGET_CENTRIC"]); export const campaignGoalOptimizeAppReattribution = z.object({mode: campaignGoalOptimizeAppReattributionMode.optional(), rate: z.number().optional()}); export const campaignGoalOptimizeCpaRepeatedForAppUaMode = z.enum(["UNKNOWN_MODE", "BUDGET_CENTRIC"]); export const campaignGoalOptimizeCpaRepeatedForAppUa = z.object({action: z.string(), mode: campaignGoalOptimizeCpaRepeatedForAppUaMode.optional(), rate: z.number().optional()}); export const campaignGoalOptimizeFixedCpmPacingPacingMode = z.enum(["NONE", "BY_FREQUENCY"]); export const campaignGoalOptimizeFixedCpmPacing = z.object({target_cpm: adcloudcommonMoney, pacing_mode: campaignGoalOptimizeFixedCpmPacingPacingMode.optional(), rate: z.number().optional()}); export const campaignGoalOptimizeLandingForWebUaMode = z.enum(["UNKNOWN_MODE", "BUDGET_CENTRIC"]); export const campaignGoalOptimizeLandingForWebUa = z.object({mode: campaignGoalOptimizeLandingForWebUaMode.optional(), rate: z.number().optional()}); export const campaignGoalOptimizeCpaForWebUaMode = z.enum(["UNKNOWN_MODE", "BUDGET_CENTRIC"]); export const campaignGoalOptimizeCpaForWebUa = z.object({action: z.string(), mode: campaignGoalOptimizeCpaForWebUaMode.optional(), rate: z.number().optional()}); export const dspCampaignGoal = z.object({type: dspCampaignGoalType, optimize_app_installs: campaignGoalOptimizeAppInstalls.optional(), optimize_cpa_for_app_ua: campaignGoalOptimizeCpaForAppUa.optional(), optimize_app_roas: campaignGoalOptimizeAppRoas.optional(), optimize_clicks_to_web: campaignGoalOptimizeClicksToWeb.optional(), optimize_clicks_to_app: campaignGoalOptimizeClicksToApp.optional(), optimize_roas_for_app_re: campaignGoalOptimizeRoasForAppRe.optional(), optimize_cpc_for_app_re: campaignGoalOptimizeCpcForAppRe.optional(), optimize_fixed_cpm: campaignGoalOptimizeFixedCpm.optional(), optimize_cpa_for_app_re: campaignGoalOptimizeCpaForAppRe.optional(), optimize_app_retention: campaignGoalOptimizeAppRetention.optional(), optimize_app_reattribution: campaignGoalOptimizeAppReattribution.optional(), optimize_cpa_repeated_for_app_ua: campaignGoalOptimizeCpaRepeatedForAppUa.optional(), optimize_fixed_cpm_pacing: campaignGoalOptimizeFixedCpmPacing.optional(), optimize_landing_for_web_ua: campaignGoalOptimizeLandingForWebUa.optional(), optimize_cpa_for_web_ua: campaignGoalOptimizeCpaForWebUa.optional(), kpi_actions: z.array(z.string()).optional()}); export const sKAdNetworkInputTargetingState = z.enum(["UNKNOWN_TARGETING_STATE", "TARGET_DO_NOT_CARE", "TARGET_ALL", "TARGET_SKADN_ONLY", "TARGET_NON_SKADN_ONLY", "TARGET_CUSTOM"]); export const sKAdNetworkInputCustomOption = z.enum(["UNKNOWN_SKAN_CUSTOM_OPTION", "SKAN_CUSTOM_OPTION_MMP_ATTRIBUTABLE", "SKAN_CUSTOM_OPTION_BI_ATTRIBUTABLE", "SKAN_CUSTOM_OPTION_NON_ATTRIBUTABLE", "SKAN_CUSTOM_OPTION_SKAN_ATTRIBUTABLE"]); export const dspSKAdNetworkInput = z.object({targeting_state: sKAdNetworkInputTargetingState.optional(), include_traffic_without_attributions: z.boolean().optional(), custom_options: z.array(sKAdNetworkInputCustomOption).optional(), prefer_mmp_attribution: z.boolean().optional()}); export const dspAdTrackingAllowance = z.enum(["UNKNOWN_AD_TRACKING_ALLOWANCE", "NON_LAT_ONLY", "LAT_ONLY", "DO_NOT_CARE"]); export const campaignServingStatus = z.object({serving_blocked: z.boolean().optional(), serving_blocked_timestamp: z.string().optional()}); export const launchNoticeNoticeType = z.enum(["UNKNOWN", "WARNING", "DISCLAIMER"]); export const launchNoticeNoticeMessage = z.enum(["UNKNOWN_MESSAGE", "MMP_PROBABILISTIC_ATTRIBUTION_STATUS_DISABLED", "MMP_VIEW_THROUGH_PROBABILISTIC_ATTRIBUTION_STATUS_DISABLED", "MMP_ADVANCED_PRIVACY_STATUS_ENABLED", "MMP_PROBABILISTIC_ATTRIBUTION_STATUS_UNKNOWN", "CAMPAIGN_WILL_PAUSE_IF_ADVANCED_PRIVACY_ENABLED_AFTER_48H"]); export const commonLaunchNotice = z.object({type: launchNoticeNoticeType.optional(), message: launchNoticeNoticeMessage.optional()}); export const dspCampaign = z.object({id: z.string().optional(), ad_account_id: z.string().optional(), product_id: z.string().optional(), title: z.string(), description: z.string().optional(), enabling_state: commonEnablingState.optional(), type: dspCampaignType, device_os: commonDeviceOs, state: dspCampaignState.optional(), countries: z.array(z.string()), currency: adcloudcommonCurrency.optional(), schedule: commonTimeInterval, budget_schedule: dspBudgetSchedule.optional(), tracking_company: adcloudcommonTrackingCompany.optional(), tracking_link_id: z.string().optional(), landing_url: z.string().optional(), goal: dspCampaignGoal, skadn_input: dspSKAdNetworkInput.optional(), custom_key_values: z.record(z.string(), z.string()).optional(), ad_tracking_allowance: dspAdTrackingAllowance.optional(), is_deleted: z.boolean().optional(), auto_delete_at: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), serving_status: campaignServingStatus.optional(), launch_notices: z.array(commonLaunchNotice).optional(), launch_notice_confirmations: z.array(commonLaunchNotice).optional()}); export const messagesListCampaignsResponse = z.object({campaigns: z.array(dspCampaign).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 }; /** * List up Campaigns. * * GET /cm/v1/campaigns */ export const getApiCmV1Campaigns = async (args: GetApiCmV1CampaignsArgs, options?: GetApiCmV1CampaignsOptions) => { const {baseUrl = "https://api.moloco.cloud", fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.ad_account_id != null) query.append("ad_account_id", String(args.ad_account_id)) if (args.product_id != null) query.append("product_id", String(args.product_id)) for (const item of args.states ?? []) query.append("states", String(item)) if (args.fetch_option != null) query.append("fetch_option", String(args.fetch_option)) if (Bearer !== undefined) headers.set("Authorization", Bearer) const url = `${baseUrl.replace(/\/+$/, '')}/cm/v1/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(messagesListCampaignsResponse, await res.json()) };