import {z} from 'zod' export type AdcloudcommonDateInterval = {start?: string | undefined, end?: string | undefined}; export type DspAnalyticsDetailDimension = 'UNKNOWN_DIMENSION' | 'DATE' | 'HOUR' | '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' | 'CAMPAIGN_COUNTRY' | 'CAMPAIGN_GOAL_TYPE' | 'AD_GROUP_ID' | 'AD_GROUP_TITLE' | 'CREATIVE_GROUP_ID' | 'CREATIVE_GROUP_TITLE' | 'CREATIVE_GROUP_IS_DCA' | 'CREATIVE_ID' | 'CREATIVE_TITLE' | 'CREATIVE_TYPE' | 'CREATIVE_MAIN_ASSET_LOCATION' | 'CREATIVE_FORMAT' | 'CREATIVE_VIDEO_DURATION_SECONDS' | 'CREATIVE_VIDEO_END_CARD_TYPE' | 'CREATIVE_IS_DCA' | 'EXCHANGE_ID' | 'SUB_PUBLISHER_ID' | 'SUB_PUBLISHER_TITLE' | 'INVENTORY_TYPE' | 'TRAFFIC_LAT'; export type DspAnalyticsDetailMetric = 'UNKNOWN_METRIC' | 'IMPRESSIONS' | 'ENGAGED_VIEWS' | 'CLICKS' | 'INSTALLS' | 'INSTALLS_CT' | 'CONVERSIONS' | 'TARGET_ACTIONS' | 'SPEND' | 'REVENUE' | 'CTR' | 'IPM' | 'CPC' | 'CPI' | 'CPA' | 'CPCONV' | 'VTR' | 'CPCV' | 'CPS' | 'CPPV' | 'PVPI' | 'VIDEO_PLAY_1Q' | 'VIDEO_PLAY_2Q' | 'VIDEO_PLAY_3Q' | 'VIDEO_PLAY_4Q' | 'PAGE_VISITS' | 'SESSIONS' | 'DRIVEN_INSTALLS' | 'MOLOCO_MEASURED_INSTALLS' | 'MOLOCO_MEASURED_EQUAL_PRIORITY_WINDOW_INSTALLS' | 'UNIQUE_VISITORS' | 'UNIQUE_PURCHASERS' | 'CPUV' | 'CPUP' | 'PAGE_VISITS_1D' | 'PAGE_VISITS_3D' | 'PAGE_VISITS_7D' | 'PAGE_VISITS_14D'; export type DspAnalyticsDetailDimensionFilterOperator = 'UNKNOWN_DIMENSION_OPERATOR' | 'IN' | 'NOT_IN'; export type DspAnalyticsDetailDimensionFilter = {dimension?: DspAnalyticsDetailDimension | undefined, operator?: DspAnalyticsDetailDimensionFilterOperator | undefined, values?: Array | undefined}; export type DspAnalyticsDetailMetricFilterOperator = 'UNKNOWN_METRIC_OPERATOR' | 'EQ' | 'GT' | 'GE' | 'LT' | 'LE'; export type DspAnalyticsDetailMetricFilter = {metric?: DspAnalyticsDetailMetric | undefined, operator?: DspAnalyticsDetailMetricFilterOperator | undefined, value?: string | undefined}; export type DspAnalyticsDetailConversionEventFilter = {operator?: DspAnalyticsDetailDimensionFilterOperator | undefined, values?: Array | undefined}; export type DspAnalyticsDetailConversionEventMetricFilterCondition = {operator?: DspAnalyticsDetailMetricFilterOperator | undefined, value?: string | undefined}; export type DspAnalyticsDetailConversionEventMetricFilter = {conversion_event?: string | undefined, count_condition?: DspAnalyticsDetailConversionEventMetricFilterCondition | undefined}; export type DspAnalyticsDetailOrderByFilter = {dimension?: DspAnalyticsDetailDimension | undefined, metric?: DspAnalyticsDetailMetric | undefined, conversion_event?: string | undefined, is_descending?: boolean | undefined}; export type MessagesQueryAnalyticsDetailRequest = {ad_account_id: string, timezone?: string | undefined, date_range: AdcloudcommonDateInterval, dimensions: Array, metrics: Array, dimension_filters?: Array | undefined, metric_filters?: Array | undefined, conversion_event_filters?: Array | undefined, conversion_event_metric_filters?: Array | undefined, order_by_filters?: Array | undefined, limit?: unknown | undefined}; export type CreateApiCmV1AnalyticsDetailArgs = {body: MessagesQueryAnalyticsDetailRequest}; export type CreateApiCmV1AnalyticsDetailOptions = {baseUrl?: string | undefined, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const adcloudcommonCurrency = z.enum(["UNKNOWN_CURRENCY", "USD", "KRW", "JPY", "EUR", "GBP"]); export const dspAnalyticsDetailAdAccountColumn = 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 dspAnalyticsDetailAppColumn = z.object({id: z.string().optional(), title: z.string().optional(), store_id: z.string().optional(), os: commonDeviceOs.optional()}); export const dspAnalyticsDetailSiteColumn = z.object({id: z.string().optional(), title: z.string().optional(), domain: z.string().optional()}); export const dspAnalyticsDetailCampaignColumn = z.object({id: z.string().optional(), title: z.string().optional(), type: z.string().optional(), target_countries: z.array(z.string()).optional(), bid_country: z.string().optional(), country: z.string().optional(), goal_type: z.string().optional(), is_cross_promo: z.boolean().optional()}); export const dspAnalyticsDetailAdGroupColumn = z.object({id: z.string().optional(), title: z.string().optional()}); export const dspAnalyticsDetailCreativeGroupColumn = z.object({id: z.string().optional(), title: z.string().optional(), is_dca: z.boolean().optional()}); export const dspAnalyticsDetailCreativeColumn = z.object({id: z.string().optional(), title: z.string().optional(), type: z.string().optional(), main_asset_location: 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 dspAnalyticsDetailExchangeColumn = z.object({id: z.string().optional()}); export const dspAnalyticsDetailSubPublisherColumnType = z.enum(["UNKNOWN_TYPE", "APP", "SITE"]); export const dspAnalyticsDetailSubPublisherColumn = z.object({type: dspAnalyticsDetailSubPublisherColumnType.optional(), id: z.string().optional(), title: z.string().optional()}); export const dspAnalyticsDetailInventoryColumn = z.object({type: z.string().optional()}); export const dspAnalyticsDetailTrafficColumn = z.object({lat: z.boolean().optional()}); export const dspAnalyticsDetailDeviceColumn = z.object({}); export const dspAnalyticsDetailMetricColumn = z.object({impressions: z.string().optional(), engaged_views: z.string().optional(), engaged_clicks: z.string().optional(), clicks: z.string().optional(), installs: z.string().optional(), installs_ct: 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(), vtr: z.number().optional(), cpcv: z.number().optional(), cps: z.number().optional(), cppv: z.number().optional(), pvpi: z.number().optional(), video_play_1q: z.string().optional(), video_play_2q: z.string().optional(), video_play_3q: z.string().optional(), video_play_4q: z.string().optional(), page_visits: z.string().optional(), sessions: z.string().optional(), driven_installs: z.string().optional(), moloco_measured_installs: z.string().optional(), moloco_measured_equal_priority_window_installs: z.string().optional(), unique_visitors: z.string().optional(), unique_purchasers: z.string().optional(), cpuv: z.number().optional(), cpup: 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 dspAnalyticsDetailConversionEventColumn = z.object({name: z.string().optional(), count: z.string().optional(), revenue: z.number().optional()}); export const dspAnalyticsDetailRow = z.object({date: z.string().optional(), hour: z.number().int().optional(), timezone: z.string().optional(), ad_account: dspAnalyticsDetailAdAccountColumn.optional(), app: dspAnalyticsDetailAppColumn.optional(), site: dspAnalyticsDetailSiteColumn.optional(), campaign: dspAnalyticsDetailCampaignColumn.optional(), ad_group: dspAnalyticsDetailAdGroupColumn.optional(), creative_group: dspAnalyticsDetailCreativeGroupColumn.optional(), creative: dspAnalyticsDetailCreativeColumn.optional(), exchange: dspAnalyticsDetailExchangeColumn.optional(), sub_publisher: dspAnalyticsDetailSubPublisherColumn.optional(), inventory: dspAnalyticsDetailInventoryColumn.optional(), traffic: dspAnalyticsDetailTrafficColumn.optional(), device: dspAnalyticsDetailDeviceColumn.optional(), metric: dspAnalyticsDetailMetricColumn.optional(), conversion_events: z.array(dspAnalyticsDetailConversionEventColumn).optional()}); export const dspAnalyticsDetailJob = z.object({id: z.string().optional()}); export const messagesQueryAnalyticsDetailResponse = z.object({rows: z.array(dspAnalyticsDetailRow).optional(), job: dspAnalyticsDetailJob.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 detail of ad performance analytics. * * POST /cm/v1/analytics-detail */ export const createApiCmV1AnalyticsDetail = async (args: CreateApiCmV1AnalyticsDetailArgs, options?: CreateApiCmV1AnalyticsDetailOptions) => { 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-detail${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(messagesQueryAnalyticsDetailResponse, await res.json()) };