Premium API Documentation

Overview

Premium API предоставляет доступ к расширенной аналитике, чат-функциям и премиальным возможностям OZON. API включает 8 методов для работы с углубленной аналитикой товаров, чатами с покупателями и премиальной отчётностью.

Key Features

  • 📊 Углублённая аналитика - детализированные данные о продажах, просмотрах и конверсии
  • 🔍 Анализ поисковых запросов - информация о том, как покупатели находят ваши товары
  • 💬 Чаты с покупателями - возможность общения с клиентами напрямую
  • 📈 Ежедневные отчёты о реализации - детальная финансовая отчётность
  • 🎯 Премиальные метрики - расширенные показатели эффективности
  • ⚠️ Подписочная модель - требуется подписка Premium или Premium Plus

Subscription Requirements

  • Premium - доступны методы анализа поисковых запросов
  • Premium Plus - полный доступ ко всем методам, включая аналитику и чаты
  • Rate Limiting - некоторые методы ограничены 1 запросом в минуту

Available Methods

Analytics Methods (Premium Plus Required)

getAnalyticsData()

Получает детализированные данные аналитики с группировкой по различным измерениям.

const analytics = await premiumApi.getAnalyticsData({
  date_from: '2024-01-01',
  date_to: '2024-01-31',
  dimension: ['sku', 'week'],
  metrics: ['revenue', 'hits_view', 'conv_tocart', 'ordered_units'],
  limit: 500,
  filters: [{
    field: 'category1',
    values: ['Electronics']
  }]
});

analytics.result?.data?.forEach(item => {
  console.log(`SKU: ${item.dimensions?.sku}`);
  console.log(`Выручка: ${item.metrics?.revenue}`);
  console.log(`Просмотры: ${item.metrics?.hits_view}`);
  console.log(`Конверсия в корзину: ${item.metrics?.conv_tocart}%`);
});

getRealizationByDay()

Получает отчёт о реализации товаров за конкретный день.

const report = await premiumApi.getRealizationByDay({
  day: 15,
  month: 1,
  year: 2024
});

console.log(`Общая выручка за день: ${report.total_amount} ${report.currency}`);
report.rows?.forEach(row => {
  console.log(`${row.name}: ${row.quantity} шт., ${row.amount} ${row.currency}`);
});

Search Analytics Methods (Premium/Premium Plus Required)

getProductQueries()

Получает информацию о поисковых запросах для ваших товаров.

const queries = await premiumApi.getProductQueries({
  date_from: '2024-01-01',
  date_to: '2024-01-31',
  skus: ['123456789', '987654321'],
  page_size: 50,
  sort_by: 'queries_count',
  sort_dir: 'DESC'
});

queries.items?.forEach(item => {
  console.log(`SKU: ${item.sku}`);
  console.log(`Запросов: ${item.queries_count}`);
  console.log(`Показы: ${item.impressions}`);
  console.log(`Клики: ${item.clicks}`);
  console.log(`CTR: ${item.ctr}%`);
});

getProductQueriesDetails()

Получает детализацию по конкретным поисковым запросам для товара.

const details = await premiumApi.getProductQueriesDetails({
  date_from: '2024-01-01',
  date_to: '2024-01-31',
  skus: ['123456789'],
  limit_by_sku: 10,
  page_size: 100,
  sort_by: 'clicks',
  sort_dir: 'DESC'
});

details.queries?.forEach(query => {
  console.log(`Запрос: "${query.query}"`);
  console.log(`Показы: ${query.impressions}, Клики: ${query.clicks}`);
  console.log(`Средняя позиция: ${query.position}, CTR: ${query.ctr}%`);
});

Chat Methods (Premium Plus Required)

startChat()

Создает новый чат с покупателем по отправлению.

const chat = await premiumApi.startChat({
  posting_number: '12345-0001-1'
});

if (chat.result?.chat_id) {
  console.log(`Чат создан: ${chat.result.chat_id}`);
  
  // Отправить первое сообщение
  await premiumApi.sendChatMessage({
    chat_id: chat.result.chat_id,
    text: 'Здравствуйте! Есть вопросы по вашему заказу?'
  });
}

sendChatMessage()

Отправляет сообщение в существующий чат.

const result = await premiumApi.sendChatMessage({
  chat_id: 'chat_123456',
  text: 'Ваш заказ готов к отправке. Ожидайте СМС с трек-номером.'
});

console.log(`Сообщение отправлено: ${result.result}`);

getChatHistory()

Получает историю сообщений чата.

const history = await premiumApi.getChatHistory({
  chat_id: 'chat_123456',
  limit: 50
});

history.messages?.forEach(message => {
  const time = new Date(message.created_at).toLocaleString();
  console.log(`[${time}] ${message.author}: ${message.text}`);
});

markChatAsRead()

Отмечает сообщения в чате как прочитанные.

await premiumApi.markChatAsRead({
  chat_id: 'chat_123456',
  message_id: 'msg_789012'
});

console.log('Сообщения отмечены как прочитанные');

TypeScript Interfaces

Request Types

interface PremiumAnalyticsGetDataRequest {
  date_from: string;
  date_to: string;
  dimension: string[];
  metrics: string[];
  limit?: number;
  filters?: AnalyticsFilter[];
}

interface AnalyticsFilter {
  field: string;
  values: string[];
}

interface PremiumProductQueriesRequest {
  date_from: string;
  date_to?: string;
  skus?: string[];
  page_size?: number;
  page_token?: string;
  sort_by?: 'queries_count' | 'impressions' | 'clicks' | 'ctr';
  sort_dir?: 'ASC' | 'DESC';
}

interface PremiumProductQueriesDetailsRequest {
  date_from: string;
  date_to?: string;
  skus: string[];
  limit_by_sku?: number;
  page_size?: number;
  page_token?: string;
  sort_by?: 'impressions' | 'clicks' | 'ctr' | 'position';
  sort_dir?: 'ASC' | 'DESC';
}

interface PremiumChatStartRequest {
  posting_number: string;
}

interface PremiumChatSendMessageRequest {
  chat_id: string;
  text: string;
}

interface PremiumChatHistoryRequest {
  chat_id: string;
  limit?: number;
  message_id_from?: string;
}

interface PremiumChatReadRequest {
  chat_id: string;
  message_id: string;
}

interface PremiumRealizationByDayRequest {
  day: number;
  month: number;
  year: number;
}

Response Types

interface PremiumAnalyticsGetDataResponse {
  result?: {
    data?: AnalyticsDataItem[];
    totals?: AnalyticsMetrics;
  };
}

interface AnalyticsDataItem {
  dimensions?: Record<string, string>;
  metrics?: AnalyticsMetrics;
}

interface AnalyticsMetrics {
  revenue?: number;
  hits_view?: number;
  hits_tocart?: number;
  hits_tobasket?: number;
  session_view?: number;
  session_view_search?: number;
  session_view_pdp?: number;
  conv_tocart?: number;
  conv_tobasket?: number;
  ordered_units?: number;
  returns?: number;
}

interface PremiumProductQueriesResponse {
  items?: ProductQuery[];
  page_token?: string;
  has_next?: boolean;
}

interface ProductQuery {
  sku: string;
  queries_count?: number;
  impressions?: number;
  clicks?: number;
  ctr?: number;
  position_avg?: number;
}

interface PremiumProductQueriesDetailsResponse {
  queries?: QueryDetails[];
  page_token?: string;
  has_next?: boolean;
}

interface QueryDetails {
  query: string;
  sku: string;
  impressions?: number;
  clicks?: number;
  ctr?: number;
  position?: number;
}

interface PremiumChatStartResponse {
  result?: {
    chat_id?: string;
  };
}

interface PremiumChatSendMessageResponse {
  result?: boolean;
  message_id?: string;
}

interface PremiumChatHistoryResponse {
  messages?: ChatMessage[];
  has_next?: boolean;
}

interface ChatMessage {
  message_id: string;
  author: 'seller' | 'buyer';
  text: string;
  created_at: string;
  is_read?: boolean;
}

interface PremiumRealizationByDayResponse {
  rows?: RealizationRow[];
  total_amount?: number;
  currency?: string;
}

interface RealizationRow {
  name: string;
  quantity: number;
  amount: number;
  currency: string;
  sku?: string;
}

Usage Examples

Basic Premium Analytics

import { OzonApi } from 'bmad-ozon-seller-api';

const ozonApi = new OzonApi({
  clientId: 'your-client-id',
  apiKey: 'your-api-key'
});

// Получение основных метрик за месяц
async function getMonthlyAnalytics() {
  try {
    const analytics = await ozonApi.premium.getAnalyticsData({
      date_from: '2024-01-01',
      date_to: '2024-01-31',
      dimension: ['sku', 'day'],
      metrics: ['revenue', 'ordered_units', 'hits_view', 'conv_tocart'],
      limit: 1000
    });
    
    let totalRevenue = 0;
    let totalViews = 0;
    let totalOrders = 0;
    
    analytics.result?.data?.forEach(item => {
      totalRevenue += item.metrics?.revenue || 0;
      totalViews += item.metrics?.hits_view || 0;
      totalOrders += item.metrics?.ordered_units || 0;
    });
    
    console.log(`📊 Общая статистика за месяц:`);
    console.log(`💰 Выручка: ${totalRevenue.toLocaleString()} ₽`);
    console.log(`👁️ Просмотры: ${totalViews.toLocaleString()}`);
    console.log(`🛒 Заказы: ${totalOrders.toLocaleString()}`);
    console.log(`📈 Конверсия: ${((totalOrders / totalViews) * 100).toFixed(2)}%`);
    
    return { totalRevenue, totalViews, totalOrders };
  } catch (error) {
    console.error('❌ Ошибка получения аналитики:', error);
    throw error;
  }
}

// Использование
const monthlyStats = await getMonthlyAnalytics();

Search Query Analysis

// Анализ эффективности поиска товаров
async function analyzeSearchPerformance(skus: string[]) {
  try {
    // Получить общие метрики по запросам
    const queries = await ozonApi.premium.getProductQueries({
      date_from: '2024-01-01',
      date_to: '2024-01-31',
      skus,
      page_size: 100,
      sort_by: 'ctr',
      sort_dir: 'DESC'
    });
    
    console.log('🔍 Топ товары по CTR:');
    queries.items?.slice(0, 5).forEach((item, index) => {
      console.log(`${index + 1}. SKU ${item.sku}: ${item.ctr}% CTR (${item.clicks}/${item.impressions})`);
    });
    
    // Получить детализацию по лучшему товару
    if (queries.items?.[0]) {
      const details = await ozonApi.premium.getProductQueriesDetails({
        date_from: '2024-01-01',
        date_to: '2024-01-31',
        skus: [queries.items[0].sku],
        limit_by_sku: 10,
        sort_by: 'clicks',
        sort_dir: 'DESC'
      });
      
      console.log(`\n🎯 Топ запросы для SKU ${queries.items[0].sku}:`);
      details.queries?.forEach((query, index) => {
        console.log(`${index + 1}. "${query.query}" - ${query.clicks} кликов, позиция ${query.position}`);
      });
    }
    
    return queries.items;
  } catch (error) {
    console.error('❌ Ошибка анализа поиска:', error);
    throw error;
  }
}

// Использование
const searchAnalysis = await analyzeSearchPerformance(['123456789', '987654321']);

Complex Scenarios

Premium Analytics Dashboard

Система для комплексного анализа премиальной аналитики:

class PremiumAnalyticsDashboard {
  constructor(private ozonApi: OzonApi) {}
  
  /**
   * Получение комплексного отчёта за период
   */
  async generateComprehensiveReport(dateFrom: string, dateTo: string, skus?: string[]) {
    try {
      // Получить основные метрики
      const analytics = await this.ozonApi.premium.getAnalyticsData({
        date_from: dateFrom,
        date_to: dateTo,
        dimension: ['sku'],
        metrics: ['revenue', 'ordered_units', 'hits_view', 'conv_tocart', 'returns'],
        limit: 1000,
        filters: skus ? [{
          field: 'sku',
          values: skus
        }] : undefined
      });
      
      // Получить данные по поисковым запросам
      const searchData = skus ? await this.ozonApi.premium.getProductQueries({
        date_from: dateFrom,
        date_to: dateTo,
        skus,
        page_size: 1000
      }) : null;
      
      // Обработать данные
      const report = this.processAnalyticsData(analytics, searchData);
      
      console.log('📊 === КОМПЛЕКСНЫЙ ОТЧЁТ ===');
      console.log(`📅 Период: ${dateFrom} - ${dateTo}`);
      console.log(`💰 Общая выручка: ${report.totalRevenue.toLocaleString()} ₽`);
      console.log(`🛒 Заказов: ${report.totalOrders.toLocaleString()}`);
      console.log(`👁️ Просмотров: ${report.totalViews.toLocaleString()}`);
      console.log(`📈 Средняя конверсия: ${report.avgConversion.toFixed(2)}%`);
      console.log(`🔄 Возвратов: ${report.totalReturns.toLocaleString()}`);
      
      if (report.topPerformers.length > 0) {
        console.log('\n🏆 Топ товары по выручке:');
        report.topPerformers.forEach((item, index) => {
          console.log(`${index + 1}. SKU ${item.sku}: ${item.revenue.toLocaleString()} ₽`);
        });
      }
      
      if (report.searchInsights) {
        console.log('\n🔍 Поисковая аналитика:');
        console.log(`Средний CTR: ${report.searchInsights.avgCTR.toFixed(2)}%`);
        console.log(`Средняя позиция: ${report.searchInsights.avgPosition.toFixed(1)}`);
      }
      
      return report;
    } catch (error) {
      console.error('❌ Ошибка генерации отчёта:', error);
      throw error;
    }
  }
  
  /**
   * Мониторинг производительности товаров
   */
  async monitorProductPerformance(skus: string[], thresholds: PerformanceThresholds) {
    try {
      const analytics = await this.ozonApi.premium.getAnalyticsData({
        date_from: this.getDateDaysAgo(7), // Последние 7 дней
        date_to: this.getToday(),
        dimension: ['sku'],
        metrics: ['revenue', 'ordered_units', 'hits_view', 'conv_tocart'],
        filters: [{
          field: 'sku',
          values: skus
        }]
      });
      
      const alerts: PerformanceAlert[] = [];
      
      analytics.result?.data?.forEach(item => {
        const sku = item.dimensions?.sku;
        const metrics = item.metrics;
        
        if (!sku || !metrics) return;
        
        // Проверка конверсии
        if (metrics.conv_tocart && metrics.conv_tocart < thresholds.minConversion) {
          alerts.push({
            sku,
            type: 'low_conversion',
            value: metrics.conv_tocart,
            threshold: thresholds.minConversion,
            severity: 'warning'
          });
        }
        
        // Проверка просмотров
        if (metrics.hits_view && metrics.hits_view < thresholds.minViews) {
          alerts.push({
            sku,
            type: 'low_views',
            value: metrics.hits_view,
            threshold: thresholds.minViews,
            severity: 'info'
          });
        }
        
        // Проверка выручки
        if (metrics.revenue && metrics.revenue < thresholds.minRevenue) {
          alerts.push({
            sku,
            type: 'low_revenue',
            value: metrics.revenue,
            threshold: thresholds.minRevenue,
            severity: 'critical'
          });
        }
      });
      
      if (alerts.length > 0) {
        console.log(`⚠️ Найдено ${alerts.length} предупреждений о производительности:`);
        alerts.forEach(alert => {
          const emoji = alert.severity === 'critical' ? '🚨' : alert.severity === 'warning' ? '⚠️' : 'ℹ️';
          console.log(`${emoji} SKU ${alert.sku}: ${alert.type} (${alert.value} < ${alert.threshold})`);
        });
      } else {
        console.log('✅ Все товары работают в пределах нормы');
      }
      
      return alerts;
    } catch (error) {
      console.error('❌ Ошибка мониторинга производительности:', error);
      throw error;
    }
  }
  
  /**
   * Анализ трендов по дням
   */
  async analyzeDailyTrends(dateFrom: string, dateTo: string) {
    try {
      const analytics = await this.ozonApi.premium.getAnalyticsData({
        date_from: dateFrom,
        date_to: dateTo,
        dimension: ['day'],
        metrics: ['revenue', 'ordered_units', 'hits_view'],
        limit: 1000
      });
      
      const dailyData: DailyTrendData[] = [];
      
      analytics.result?.data?.forEach(item => {
        const day = item.dimensions?.day;
        const metrics = item.metrics;
        
        if (day && metrics) {
          dailyData.push({
            date: day,
            revenue: metrics.revenue || 0,
            orders: metrics.ordered_units || 0,
            views: metrics.hits_view || 0
          });
        }
      });
      
      // Сортировка по дате
      dailyData.sort((a, b) => a.date.localeCompare(b.date));
      
      // Вычисление трендов
      const trends = this.calculateTrends(dailyData);
      
      console.log('📈 Анализ трендов:');
      console.log(`Выручка: ${trends.revenue > 0 ? '↗️' : trends.revenue < 0 ? '↘️' : '➡️'} ${trends.revenue.toFixed(2)}%`);
      console.log(`Заказы: ${trends.orders > 0 ? '↗️' : trends.orders < 0 ? '↘️' : '➡️'} ${trends.orders.toFixed(2)}%`);
      console.log(`Просмотры: ${trends.views > 0 ? '↗️' : trends.views < 0 ? '↘️' : '➡️'} ${trends.views.toFixed(2)}%`);
      
      return { dailyData, trends };
    } catch (error) {
      console.error('❌ Ошибка анализа трендов:', error);
      throw error;
    }
  }
  
  private processAnalyticsData(analytics: any, searchData: any) {
    const data = analytics.result?.data || [];
    
    let totalRevenue = 0;
    let totalOrders = 0;
    let totalViews = 0;
    let totalReturns = 0;
    let conversionSum = 0;
    let conversionCount = 0;
    
    const skuMetrics: Record<string, any> = {};
    
    data.forEach((item: any) => {
      const sku = item.dimensions?.sku;
      const metrics = item.metrics;
      
      if (sku && metrics) {
        totalRevenue += metrics.revenue || 0;
        totalOrders += metrics.ordered_units || 0;
        totalViews += metrics.hits_view || 0;
        totalReturns += metrics.returns || 0;
        
        if (metrics.conv_tocart) {
          conversionSum += metrics.conv_tocart;
          conversionCount++;
        }
        
        skuMetrics[sku] = metrics;
      }
    });
    
    const topPerformers = Object.entries(skuMetrics)
      .map(([sku, metrics]) => ({ sku, revenue: metrics.revenue || 0 }))
      .sort((a, b) => b.revenue - a.revenue)
      .slice(0, 5);
    
    let searchInsights = null;
    if (searchData?.items) {
      const totalCTR = searchData.items.reduce((sum: number, item: any) => sum + (item.ctr || 0), 0);
      const totalPosition = searchData.items.reduce((sum: number, item: any) => sum + (item.position_avg || 0), 0);
      
      searchInsights = {
        avgCTR: totalCTR / searchData.items.length,
        avgPosition: totalPosition / searchData.items.length
      };
    }
    
    return {
      totalRevenue,
      totalOrders,
      totalViews,
      totalReturns,
      avgConversion: conversionCount > 0 ? conversionSum / conversionCount : 0,
      topPerformers,
      searchInsights
    };
  }
  
  private calculateTrends(data: DailyTrendData[]) {
    if (data.length < 2) {
      return { revenue: 0, orders: 0, views: 0 };
    }
    
    const first = data[0];
    const last = data[data.length - 1];
    
    return {
      revenue: ((last.revenue - first.revenue) / first.revenue) * 100,
      orders: ((last.orders - first.orders) / first.orders) * 100,
      views: ((last.views - first.views) / first.views) * 100
    };
  }
  
  private getToday(): string {
    return new Date().toISOString().split('T')[0];
  }
  
  private getDateDaysAgo(days: number): string {
    const date = new Date();
    date.setDate(date.getDate() - days);
    return date.toISOString().split('T')[0];
  }
}

// Интерфейсы для системы аналитики
interface PerformanceThresholds {
  minConversion: number;
  minViews: number;
  minRevenue: number;
}

interface PerformanceAlert {
  sku: string;
  type: string;
  value: number;
  threshold: number;
  severity: 'info' | 'warning' | 'critical';
}

interface DailyTrendData {
  date: string;
  revenue: number;
  orders: number;
  views: number;
}

// Использование системы аналитики
const dashboard = new PremiumAnalyticsDashboard(ozonApi);

// Генерация комплексного отчёта
const report = await dashboard.generateComprehensiveReport(
  '2024-01-01',
  '2024-01-31',
  ['123456789', '987654321']
);

// Мониторинг производительности
const alerts = await dashboard.monitorProductPerformance(
  ['123456789', '987654321'],
  {
    minConversion: 2.0, // 2%
    minViews: 100,
    minRevenue: 10000
  }
);

// Анализ трендов
const trends = await dashboard.analyzeDailyTrends('2024-01-01', '2024-01-31');

Premium Chat Manager

Система управления чатами с покупателями:

class PremiumChatManager {
  constructor(private ozonApi: OzonApi) {}
  
  /**
   * Создание и настройка чата для заказа
   */
  async setupOrderChat(postingNumber: string, welcomeMessage?: string) {
    try {
      // Создать чат
      const chat = await this.ozonApi.premium.startChat({
        posting_number: postingNumber
      });
      
      if (!chat.result?.chat_id) {
        throw new Error('Не удалось создать чат');
      }
      
      const chatId = chat.result.chat_id;
      console.log(`✅ Чат создан: ${chatId}`);
      
      // Отправить приветственное сообщение
      if (welcomeMessage) {
        await this.ozonApi.premium.sendChatMessage({
          chat_id: chatId,
          text: welcomeMessage
        });
        
        console.log('📝 Приветственное сообщение отправлено');
      }
      
      return chatId;
    } catch (error) {
      console.error(`❌ Ошибка создания чата для заказа ${postingNumber}:`, error);
      throw error;
    }
  }
  
  /**
   * Массовая отправка уведомлений по заказам
   */
  async sendBulkNotifications(notifications: OrderNotification[]) {
    const results: NotificationResult[] = [];
    
    for (const notification of notifications) {
      try {
        let chatId = notification.chatId;
        
        // Создать чат если не существует
        if (!chatId) {
          const chat = await this.ozonApi.premium.startChat({
            posting_number: notification.postingNumber
          });
          
          if (chat.result?.chat_id) {
            chatId = chat.result.chat_id;
          } else {
            throw new Error('Не удалось создать чат');
          }
        }
        
        // Отправить сообщение
        await this.ozonApi.premium.sendChatMessage({
          chat_id: chatId,
          text: notification.message
        });
        
        results.push({
          postingNumber: notification.postingNumber,
          chatId,
          status: 'sent',
          timestamp: new Date().toISOString()
        });
        
        console.log(`✅ Уведомление отправлено для заказа ${notification.postingNumber}`);
        
        // Задержка между сообщениями
        await new Promise(resolve => setTimeout(resolve, 1000));
      } catch (error) {
        results.push({
          postingNumber: notification.postingNumber,
          status: 'failed',
          error: error.message,
          timestamp: new Date().toISOString()
        });
        
        console.error(`❌ Ошибка отправки для заказа ${notification.postingNumber}:`, error);
      }
    }
    
    return results;
  }
  
  /**
   * Получение и обработка истории чата
   */
  async processChatHistory(chatId: string) {
    try {
      const history = await this.ozonApi.premium.getChatHistory({
        chat_id: chatId,
        limit: 100
      });
      
      if (!history.messages) {
        console.log('История чата пуста');
        return null;
      }
      
      const analysis = {
        totalMessages: history.messages.length,
        sellerMessages: history.messages.filter(m => m.author === 'seller').length,
        buyerMessages: history.messages.filter(m => m.author === 'buyer').length,
        unreadMessages: history.messages.filter(m => !m.is_read).length,
        lastMessage: history.messages[0],
        firstMessage: history.messages[history.messages.length - 1]
      };
      
      console.log(`📊 Анализ чата ${chatId}:`);
      console.log(`Всего сообщений: ${analysis.totalMessages}`);
      console.log(`От продавца: ${analysis.sellerMessages}`);
      console.log(`От покупателя: ${analysis.buyerMessages}`);
      console.log(`Непрочитанных: ${analysis.unreadMessages}`);
      
      // Отметить как прочитанные если есть непрочитанные
      if (analysis.unreadMessages > 0 && analysis.lastMessage) {
        await this.ozonApi.premium.markChatAsRead({
          chat_id: chatId,
          message_id: analysis.lastMessage.message_id
        });
        
        console.log('✅ Сообщения отмечены как прочитанные');
      }
      
      return analysis;
    } catch (error) {
      console.error(`❌ Ошибка обработки истории чата ${chatId}:`, error);
      throw error;
    }
  }
  
  /**
   * Автоматические ответы на часто задаваемые вопросы
   */
  async handleCommonQuestions(chatId: string, incomingMessage: string) {
    const commonResponses: Record<string, string> = {
      'когда отправите': 'Ваш заказ будет отправлен в течение 1-2 рабочих дней. Как только заказ будет передан в доставку, вы получите SMS с трек-номером.',
      'где мой заказ': 'Для отслеживания заказа используйте трек-номер из SMS. Также вы можете следить за статусом в мобильном приложении OZON.',
      'можно ли отменить': 'Отмена заказа возможна до момента передачи в доставку. Обратитесь в службу поддержки OZON для отмены.',
      'неправильный размер': 'Если размер не подойдет, вы можете вернуть товар в течение 14 дней. Возврат оформляется через ваш личный кабинет.',
      'гарантия': 'На товар распространяется гарантия производителя. Подробности указаны в карточке товара и в документах при получении.'
    };
    
    const lowerMessage = incomingMessage.toLowerCase();
    
    for (const [keyword, response] of Object.entries(commonResponses)) {
      if (lowerMessage.includes(keyword)) {
        await this.ozonApi.premium.sendChatMessage({
          chat_id: chatId,
          text: response
        });
        
        console.log(`🤖 Автоматический ответ отправлен для вопроса о "${keyword}"`);
        return true;
      }
    }
    
    return false;
  }
}

// Интерфейсы для системы чатов
interface OrderNotification {
  postingNumber: string;
  chatId?: string;
  message: string;
}

interface NotificationResult {
  postingNumber: string;
  chatId?: string;
  status: 'sent' | 'failed';
  error?: string;
  timestamp: string;
}

// Использование системы управления чатами
const chatManager = new PremiumChatManager(ozonApi);

// Массовая отправка уведомлений о готовности к отправке
const notifications: OrderNotification[] = [
  {
    postingNumber: '12345-0001-1',
    message: 'Ваш заказ собран и готов к отправке. Ожидайте SMS с трек-номером.'
  },
  {
    postingNumber: '12345-0002-1',
    message: 'Заказ отправлен! Трек-номер придёт в SMS в течение часа.'
  }
];

const notificationResults = await chatManager.sendBulkNotifications(notifications);
console.log('Результаты отправки:', notificationResults);

// Обработка истории чата
const chatAnalysis = await chatManager.processChatHistory('chat_123456');

Error Handling

// Комплексная обработка ошибок премиальных методов
async function safePremiumOperations() {
  try {
    // Проверка доступности премиальных функций
    const analytics = await ozonApi.premium.getAnalyticsData({
      date_from: '2024-01-01',
      date_to: '2024-01-31',
      dimension: ['sku'],
      metrics: ['revenue'],
      limit: 10
    });
    
    return analytics;
  } catch (error) {
    if (error.code === 'PREMIUM_SUBSCRIPTION_REQUIRED') {
      console.error('❌ Требуется подписка Premium Plus для доступа к аналитике');
    } else if (error.code === 'RATE_LIMIT_EXCEEDED') {
      console.error('❌ Превышен лимит запросов (1 запрос в минуту)');
      console.log('⏳ Повторите запрос через минуту');
    } else if (error.code === 'INVALID_DATE_RANGE') {
      console.error('❌ Неверный диапазон дат');
    } else if (error.code === 'CHAT_NOT_FOUND') {
      console.error('❌ Чат не найден или недоступен');
    } else if (error.code === 'MESSAGE_TOO_LONG') {
      console.error('❌ Сообщение слишком длинное (максимум 4000 символов)');
    } else {
      console.error('❌ Неожиданная ошибка:', error);
    }
    
    throw error;
  }
}

Best Practices

1. Управление подпиской

const subscriptionBestPractices = {
  // Проверяйте доступность методов
  checkSubscription: async () => {
    try {
      await ozonApi.premium.getAnalyticsData({
        date_from: '2024-01-01',
        date_to: '2024-01-01',
        dimension: ['sku'],
        metrics: ['revenue'],
        limit: 1
      });
      return 'premium_plus';
    } catch (error) {
      if (error.code === 'PREMIUM_SUBSCRIPTION_REQUIRED') {
        return 'basic';
      }
      throw error;
    }
  },
  
  // Кэшируйте результаты аналитики
  useCache: true,
  cacheTTL: 3600000, // 1 час
  
  // Соблюдайте rate limits
  respectRateLimit: true,
  minRequestInterval: 60000 // 1 минута
};

2. Оптимизация запросов аналитики

const analyticsOptimization = {
  // Запрашивайте только нужные метрики
  selectiveMetrics: ['revenue', 'ordered_units'], // Не все сразу
  
  // Используйте фильтры для уменьшения объёма данных
  useFilters: true,
  
  // Разбивайте большие периоды на части
  maxDateRange: 31, // дней
  
  // Ограничивайте количество результатов
  reasonableLimit: 1000
};

3. Управление чатами

const chatBestPractices = {
  // Шаблоны сообщений
  messageTemplates: {
    welcome: 'Здравствуйте! Спасибо за покупку. Есть вопросы по заказу?',
    shipped: 'Ваш заказ отправлен! Трек-номер: {trackNumber}',
    support: 'По возникшим вопросам обращайтесь в службу поддержки OZON.'
  },
  
  // Автоматические ответы
  enableAutoResponses: true,
  
  // Мониторинг непрочитанных сообщений
  checkUnreadInterval: 300000, // 5 минут
  
  // Максимальная длина сообщения
  maxMessageLength: 4000
};

Integration Notes

  • Подписка: Premium методы требуют активной подписки Premium или Premium Plus
  • Rate Limiting: getAnalyticsData - 1 запрос в минуту, остальные методы - стандартные лимиты
  • Данные: Аналитические данные доступны с задержкой 1-2 дня
  • Чаты: Доступны только для Premium Plus подписчиков
  • Период: Максимальный период для аналитики - 92 дня
  • Реализация: Данные о реализации доступны за последние 32 дня
  • Фильтры: Поддерживаются фильтры по категориям, брендам, SKU

Premium API открывает доступ к мощным инструментам аналитики и коммуникации, позволяя глубоко анализировать эффективность продаж и поддерживать прямую связь с покупателями.