import {z} from 'zod' export type AdcloudcommonDateInterval = {start?: string | undefined, end?: string | undefined}; export type DspAnalyticsOverviewDimension = 'UNKNOWN_GROUP_BY' | 'DATE' | 'TIMEZONE' | 'AD_ACCOUNT_ID' | 'AD_ACCOUNT_TITLE' | 'AD_ACCOUNT_CURRENCY' | 'APP_OR_SITE_ID' | 'APP_OR_SITE_TITLE' | 'APP_TYPE' | 'APP_OS' | 'APP_STORE_ID' | 'SITE_DOMAIN' | 'CAMPAIGN_ID' | 'CAMPAIGN_TITLE' | 'CAMPAIGN_TYPE' | 'CAMPAIGN_TARGET_COUNTRIES' | 'CAMPAIGN_BID_COUNTRY' | 'AD_GROUP_ID' | 'AD_GROUP_TITLE' | 'TRAFFIC_LAT' | 'CAMPAIGN_GOAL_TYPE' | 'CREATIVE_GROUP_ID' | 'CREATIVE_GROUP_TITLE' | 'CREATIVE_GROUP_IS_DCA' | 'CREATIVE_ID' | 'CREATIVE_TITLE' | 'CREATIVE_TYPE' | 'CREATIVE_MAIN_ASSET_URL' | 'CREATIVE_FORMAT' | 'CREATIVE_VIDEO_DURATION_SECONDS' | 'CREATIVE_VIDEO_END_CARD_TYPE' | 'CREATIVE_IS_DCA' | 'EXCHANGE_ID' | 'SUB_PUBLISHER_TYPE' | 'INVENTORY_TYPE'; export type DspAnalyticsOverviewMetric = 'UNKNOWN_ORDER_BY_COLUMN' | 'IMPRESSIONS' | 'ENGAGED_VIEWS' | 'CLICKS' | 'INSTALLS' | 'TARGET_ACTIONS' | 'CONVERSIONS' | 'SPEND' | 'REVENUE' | 'CTR' | 'IPM' | 'CPC' | 'CPI' | 'CPA' | 'CPCONV' | 'D1_KPI_ACTION' | 'D1_KPI_USER' | 'D1_PURCHASE' | 'D1_PURCHASER' | 'D1_REVENUE' | 'D1_ROAS' | 'D1_CPA' | 'D3_KPI_ACTION' | 'D3_KPI_USER' | 'D3_PURCHASE' | 'D3_PURCHASER' | 'D3_REVENUE' | 'D3_ROAS' | 'D3_CPA' | 'D7_KPI_ACTION' | 'D7_KPI_USER' | 'D7_PURCHASE' | 'D7_PURCHASER' | 'D7_REVENUE' | 'D7_ROAS' | 'D7_CPA' | 'D14_KPI_ACTION' | 'D14_KPI_USER' | 'D14_PURCHASE' | 'D14_PURCHASER' | 'D14_REVENUE' | 'D14_ROAS' | 'D14_CPA' | 'D30_KPI_ACTION' | 'D30_KPI_USER' | 'D30_PURCHASE' | 'D30_PURCHASER' | 'D30_REVENUE' | 'D30_ROAS' | 'D30_CPA' | 'PAGE_VISITS' | 'SESSIONS' | 'CPS' | 'CPPV' | 'PVPI' | 'DRIVEN_INSTALLS' | 'MOLOCO_MEASURED_INSTALLS' | 'MOLOCO_MEASURED_EQUAL_PRIORITY_WINDOW_INSTALLS' | 'LANDING_2H' | 'CPRE' | 'UNIQUE_VISITORS' | 'UNIQUE_PURCHASERS' | 'CPUV' | 'CPUP' | 'PAGE_VISITS_1D' | 'PAGE_VISITS_3D' | 'PAGE_VISITS_7D' | 'PAGE_VISITS_14D'; export type DspAnalyticsOverviewOrderByFilter = {dimension?: DspAnalyticsOverviewDimension | undefined, metric?: DspAnalyticsOverviewMetric | undefined, is_descending?: boolean | undefined}; export type DspAnalyticsOverviewDimensionFilterOperator = 'UNKNOWN_DIMENSION_OPERATOR' | 'IN' | 'NOT_IN'; export type DspAnalyticsOverviewDimensionFilter = {dimension?: DspAnalyticsOverviewDimension | undefined, operator?: DspAnalyticsOverviewDimensionFilterOperator | undefined, values?: Array | undefined}; export type DspAnalyticsOverviewMetricFilterOperator = 'UNKNOWN_METRIC_OPERATOR' | 'EQ' | 'GT' | 'GE' | 'LT' | 'LE'; export type DspAnalyticsOverviewMetricFilter = {metric?: DspAnalyticsOverviewMetric | undefined, operator?: DspAnalyticsOverviewMetricFilterOperator | undefined, value?: string | undefined}; export type DspAnalyticsOverviewType = 'USER_ACQUISITION' | 'REENGAGEMENT'; export type MessagesQueryAnalyticsOverviewRequest = {ad_account_id: string, date_range: AdcloudcommonDateInterval, dimensions: Array, metrics: Array, order_by_filters?: Array | undefined, limit?: unknown | undefined, dimension_filters?: Array | undefined, metric_filters?: Array | undefined, type?: DspAnalyticsOverviewType | undefined}; export type CreateApiCmV1AnalyticsOverviewArgs = {body: MessagesQueryAnalyticsOverviewRequest}; export type CreateApiCmV1AnalyticsOverviewOptions = {baseUrl?: string | undefined, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const adcloudcommonCurrency = z.enum(["UNKNOWN_CURRENCY", "USD", "KRW", "JPY", "EUR", "GBP"]); export const dspAnalyticsOverviewAdAccountColumn = z.object({id: z.string().optional(), title: z.string().optional(), currency: adcloudcommonCurrency.optional()}); export const commonDeviceOs = z.enum(["UNKNOWN_DEVICE_OS", "ANDROID", "IOS", "VERSATILE", "MOBILE_WEB", "MACOS", "WINDOWS", "NEXT_VERSATILE"]); export const dspAnalyticsOverviewAppColumn = z.object({id: z.string().optional(), title: z.string().optional(), store_id: z.string().optional(), os: commonDeviceOs.optional()}); export const dspAnalyticsOverviewSiteColumn = z.object({id: z.string().optional(), title: z.string().optional(), domain: z.string().optional()}); export const dspAnalyticsOverviewCampaignColumn = z.object({id: z.string().optional(), title: z.string().optional(), target_countries: z.array(z.string()).optional(), bid_country: z.string().optional(), type: z.string().optional(), goal_type: z.string().optional(), is_cross_promo: z.boolean().optional()}); export const dspAnalyticsOverviewAdGroupColumn = z.object({id: z.string().optional(), title: z.string().optional()}); export const dspAnalyticsOverviewMetricCount = z.object({d1: z.string().optional(), d3: z.string().optional(), d7: z.string().optional(), d14: z.string().optional(), d30: z.string().optional()}); export const dspAnalyticsOverviewMetricRevenue = z.object({d1: z.number().optional(), d3: z.number().optional(), d7: z.number().optional(), d14: z.number().optional(), d30: z.number().optional()}); export const dspAnalyticsOverviewMetricRatio = z.object({d1: z.number().optional(), d3: z.number().optional(), d7: z.number().optional(), d14: z.number().optional(), d30: z.number().optional()}); export const dspAnalyticsOverviewMetricColumn = z.object({impressions: z.string().optional(), engaged_views: z.string().optional(), clicks: z.string().optional(), installs: z.string().optional(), conversions: z.string().optional(), target_actions: z.string().optional(), spend: z.number().optional(), revenue: z.number().optional(), ctr: z.number().optional(), ipm: z.number().optional(), cpc: z.number().optional(), cpi: z.number().optional(), cpa: z.number().optional(), cpconv: z.number().optional(), cohort_kpi_action: dspAnalyticsOverviewMetricCount.optional(), cohort_kpi_user: dspAnalyticsOverviewMetricCount.optional(), cohort_purchase: dspAnalyticsOverviewMetricCount.optional(), cohort_purchaser: dspAnalyticsOverviewMetricCount.optional(), cohort_revenue: dspAnalyticsOverviewMetricRevenue.optional(), cohort_roas: dspAnalyticsOverviewMetricRatio.optional(), cohort_cpa: dspAnalyticsOverviewMetricRatio.optional(), landing_2h: z.string().optional(), cpre: z.number().optional(), page_visits_1d: z.string().optional(), page_visits_3d: z.string().optional(), page_visits_7d: z.string().optional(), page_visits_14d: z.string().optional()}); export const dspAnalyticsOverviewTrafficColumn = z.object({lat: z.string().optional()}); export const dspAnalyticsOverviewCreativeGroupColumn = z.object({id: z.string().optional(), title: z.string().optional(), is_dca: z.boolean().optional()}); export const dspAnalyticsOverviewCreativeColumn = z.object({id: z.string().optional(), title: z.string().optional(), type: z.string().optional(), main_asset_url: z.string().optional(), format: z.string().optional(), video_duration_seconds: z.number().int().optional(), video_end_card_type: z.string().optional(), is_dca: z.boolean().optional()}); export const dspAnalyticsOverviewExchangeColumn = z.object({id: z.string().optional()}); export const dspAnalyticsOverviewSubPublisherColumnType = z.enum(["UNKNOWN_TYPE", "APP", "SITE"]); export const dspAnalyticsOverviewSubPublisherColumn = z.object({type: dspAnalyticsOverviewSubPublisherColumnType.optional()}); export const dspAnalyticsOverviewInventoryColumn = z.object({type: z.string().optional()}); export const dspAnalyticsOverviewDeviceColumn = z.object({}); export const dspAnalyticsOverviewRow = z.object({date: z.string().optional(), timezone: z.string().optional(), ad_account: dspAnalyticsOverviewAdAccountColumn.optional(), app: dspAnalyticsOverviewAppColumn.optional(), site: dspAnalyticsOverviewSiteColumn.optional(), campaign: dspAnalyticsOverviewCampaignColumn.optional(), ad_group: dspAnalyticsOverviewAdGroupColumn.optional(), metric: dspAnalyticsOverviewMetricColumn.optional(), traffic: dspAnalyticsOverviewTrafficColumn.optional(), creative_group: dspAnalyticsOverviewCreativeGroupColumn.optional(), creative: dspAnalyticsOverviewCreativeColumn.optional(), exchange: dspAnalyticsOverviewExchangeColumn.optional(), sub_publisher: dspAnalyticsOverviewSubPublisherColumn.optional(), inventory: dspAnalyticsOverviewInventoryColumn.optional(), device: dspAnalyticsOverviewDeviceColumn.optional()}); export const messagesQueryAnalyticsOverviewResponse = z.object({rows: z.array(dspAnalyticsOverviewRow).optional(), num_rows: 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 }; /** * Provide the overview of ad performance analytics. * * POST /cm/v1/analytics-overview */ export const createApiCmV1AnalyticsOverview = async (args: CreateApiCmV1AnalyticsOverviewArgs, options?: CreateApiCmV1AnalyticsOverviewOptions) => { const {baseUrl = "https://api.moloco.cloud", fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (Bearer !== undefined) headers.set("Authorization", Bearer) const url = `${baseUrl.replace(/\/+$/, '')}/cm/v1/analytics-overview${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(messagesQueryAnalyticsOverviewResponse, await res.json()) };