import {z} from 'zod' export type AdcloudcommonDateInterval = {start?: string | undefined, end?: string | undefined}; export type DspAnalyticsSKAdNetworkDimension = 'UNKNOWN_DIMENSION' | 'DATE' | 'HOUR' | 'TIMEZONE' | 'AD_ACCOUNT_ID' | 'AD_ACCOUNT_TITLE' | 'AD_ACCOUNT_CURRENCY' | 'APP_ID' | 'APP_TITLE' | 'APP_STORE_ID' | 'CAMPAIGN_ID' | 'CAMPAIGN_TITLE' | 'CAMPAIGN_TYPE' | 'CAMPAIGN_TARGET_COUNTRIES' | 'CAMPAIGN_COUNTRY' | 'TRAFFIC_LAT' | 'TRAFFIC_SKAN_REQ' | 'TRAFFIC_SKAN_BID' | 'TRAFFIC_MMP_EFFECTIVE'; export type AnalyticsSKAdNetworkSKANConversionDimension = 'UNKNOWN_SKAN_CONVERSION_DIMENSION' | 'CONVERSION_VALUE' | 'VERSION' | 'FIDELITY_TYPE'; export type DspAnalyticsSKAdNetworkMetric = 'UNKNOWN_METRIC' | 'IMPRESSIONS' | 'CLICKS' | 'INSTALLS' | 'INSTALLS_CT' | 'MMP_CONVERSIONS' | 'TARGET_ACTIONS' | 'SPEND' | 'REVENUE' | 'SKAN_INSTALLS' | 'SKAN_ACTIONS' | 'SKAN_REVENUE' | 'CTR' | 'IPM' | 'CPC' | 'CPI' | 'CPA' | 'CPCONV' | 'SKAN_CPA' | 'SKAN_IPM' | 'SKAN_CPI' | 'SKAN_CONVERSION_VALUE_RATIO'; export type DspAnalyticsSKAdNetworkDimensionFilterOperator = 'UNKNOWN_DIMENSION_OPERATOR' | 'IN' | 'NOT_IN'; export type DspAnalyticsSKAdNetworkDimensionFilter = {dimension?: DspAnalyticsSKAdNetworkDimension | undefined, operator?: DspAnalyticsSKAdNetworkDimensionFilterOperator | undefined, values?: Array | undefined}; export type DspAnalyticsSKAdNetworkMetricFilterOperator = 'UNKNOWN_METRIC_OPERATOR' | 'EQ' | 'GT' | 'GE' | 'LT' | 'LE'; export type DspAnalyticsSKAdNetworkMetricFilter = {metric?: DspAnalyticsSKAdNetworkMetric | undefined, operator?: DspAnalyticsSKAdNetworkMetricFilterOperator | undefined, value?: string | undefined}; export type DspAnalyticsSKAdNetworkOrderByFilter = {dimension?: DspAnalyticsSKAdNetworkDimension | undefined, metric?: DspAnalyticsSKAdNetworkMetric | undefined, is_descending?: boolean | undefined}; export type MessagesQueryAnalyticsSKAdNetworkRequest = {ad_account_id: string, timezone?: string | undefined, date_range: AdcloudcommonDateInterval, dimensions: Array, skan_conversion_dimensions: Array, metrics: Array, dimension_filters?: Array | undefined, metric_filters?: Array | undefined, order_by_filters?: Array | undefined, limit?: unknown | undefined}; export type CreateApiCmV1AnalyticsSkadnetworkArgs = {body: MessagesQueryAnalyticsSKAdNetworkRequest}; export type CreateApiCmV1AnalyticsSkadnetworkOptions = {baseUrl?: string | undefined, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const adcloudcommonCurrency = z.enum(["UNKNOWN_CURRENCY", "USD", "KRW", "JPY", "EUR", "GBP"]); export const dspAnalyticsSKAdNetworkAdAccountColumn = z.object({id: z.string().optional(), title: z.string().optional(), currency: adcloudcommonCurrency.optional()}); export const dspAnalyticsSKAdNetworkAppColumn = z.object({id: z.string().optional(), title: z.string().optional(), store_id: z.string().optional()}); export const dspAnalyticsSKAdNetworkCampaignColumn = z.object({id: z.string().optional(), title: z.string().optional(), type: z.string().optional(), target_countries: z.array(z.string()).optional(), country: z.string().optional()}); export const dspAnalyticsSKAdNetworkTrafficColumn = z.object({lat: z.boolean().optional(), skan_req: z.boolean().optional(), skan_bid: z.boolean().optional(), mmp_effective: z.boolean().optional()}); export const dspAnalyticsSKAdNetworkMetricColumn = z.object({impressions: z.string().optional(), clicks: z.string().optional(), installs: z.string().optional(), installs_ct: z.string().optional(), mmp_conversions: z.string().optional(), target_actions: z.string().optional(), spend: z.number().optional(), revenue: z.number().optional(), skan_actions: z.string().optional(), skan_installs: z.string().optional(), skan_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(), skan_ipm: z.number().optional(), skan_cpi: z.number().optional(), skan_cpa: z.number().optional(), skan_conversion_value_ratio: z.number().optional()}); export const analyticsSKAdNetworkSKANConversionEventColumn = z.object({name: z.string().optional(), count: z.string().optional(), revenue_min_sum: z.number().optional(), revenue_max_sum: z.number().optional()}); export const analyticsSKAdNetworkSKANConversionColumn = z.object({conversion_value: z.string().optional(), version: z.string().optional(), fidelity_type: z.string().optional(), conversion_count: z.string().optional(), non_winning_conversion_count: z.string().optional(), conversion_events: z.array(analyticsSKAdNetworkSKANConversionEventColumn).optional()}); export const dspAnalyticsSKAdNetworkRow = z.object({date: z.string().optional(), hour: z.number().int().optional(), timezone: z.string().optional(), ad_account: dspAnalyticsSKAdNetworkAdAccountColumn.optional(), app: dspAnalyticsSKAdNetworkAppColumn.optional(), campaign: dspAnalyticsSKAdNetworkCampaignColumn.optional(), traffic: dspAnalyticsSKAdNetworkTrafficColumn.optional(), metric: dspAnalyticsSKAdNetworkMetricColumn.optional(), skan_conversions: z.array(analyticsSKAdNetworkSKANConversionColumn).optional()}); export const dspAnalyticsSKAdNetworkJob = z.object({id: z.string().optional()}); export const messagesQueryAnalyticsSKAdNetworkResponse = z.object({rows: z.array(dspAnalyticsSKAdNetworkRow).optional(), job: dspAnalyticsSKAdNetworkJob.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 SKAdNetwork ad performance analytics. * * POST /cm/v1/analytics-skadnetwork */ export const createApiCmV1AnalyticsSkadnetwork = async (args: CreateApiCmV1AnalyticsSkadnetworkArgs, options?: CreateApiCmV1AnalyticsSkadnetworkOptions) => { 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-skadnetwork${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(messagesQueryAnalyticsSKAdNetworkResponse, await res.json()) };