💬 Review API

Управление отзывами клиентов

API для работы с отзывами и комментариями — доступен только для продавцов с подпиской Premium Plus.

🔒 Только для Premium Plus
📚 Категории 📑 Индекс API 🚀 Быстрый старт ❓ FAQ

📋 Методы (7 endpoints)

Метод Endpoint Назначение
getList /v1/review/list Список отзывов с фильтрацией
getInfo /v1/review/info Подробная информация об отзыве
getCount /v1/review/count Количество отзывов по статусам
changeStatus /v1/review/change-status Изменение статуса отзывов
createComment /v1/review/comment/create Ответ на отзыв
deleteComment /v1/review/comment/delete Удаление комментария
getCommentList /v1/review/comment/list Список комментариев к отзыву

🚀 Быстрый старт

Инициализация клиента

import { OzonSellerAPI } from 'daytona-ozon-seller-api';

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

// ⚠️ Требуется подписка Premium Plus

Базовый workflow управления отзывами

try {
  // 1. Получить статистику отзывов
  const counts = await client.review.getCount();
  console.log(`📊 Всего: ${counts.total}, Необработанных: ${counts.unprocessed}`);

  // 2. Получить список необработанных отзывов
  const reviews = await client.review.getList({
    limit: 50,
    status: 'UNPROCESSED',
    sort_dir: 'DESC'
  });

  // 3. Обработать каждый отзыв
  for (const review of reviews.reviews || []) {
    console.log(`\n⭐ ${review.rating}/5 - SKU: ${review.sku}`);
    console.log(`📝 ${review.text.substring(0, 100)}...`);
    
    // 4. Ответить на отзыв
    if (review.rating >= 4) {
      await client.review.createComment({
        review_id: review.id,
        text: 'Спасибо за положительный отзыв! 😊',
        mark_review_as_processed: true
      });
    } else {
      await client.review.createComment({
        review_id: review.id,
        text: 'Благодарим за отзыв. Мы учтем ваши замечания для улучшения качества.',
        mark_review_as_processed: true
      });
    }
  }

} catch (error) {
  console.error('❌ Ошибка управления отзывами:', error);
}

🎯 Основные методы

getList() - Список отзывов

interface ReviewListRequest {
  /** Количество отзывов (20-100) */
  limit: number;
  /** ID последнего отзыва для пагинации */
  last_id?: string;
  /** Направление сортировки */
  sort_dir?: 'ASC' | 'DESC';
  /** Фильтр по статусу */
  status?: 'ALL' | 'UNPROCESSED' | 'PROCESSED';
}

interface ReviewListItem {
  id: string;
  sku: number;
  text: string;
  rating: number;
  published_at: string;
  status: 'UNPROCESSED' | 'PROCESSED';
  order_status: 'DELIVERED' | 'CANCELLED';
  comments_amount: number;
  photos_amount: number;
  videos_amount: number;
}

createComment() - Ответ на отзыв

interface CommentCreateRequest {
  /** ID отзыва */
  review_id: string;
  /** Текст комментария */
  text: string;
  /** Отметить отзыв как обработанный */
  mark_review_as_processed?: boolean;
  /** ID родительского комментария */
  parent_comment_id?: string;
}

interface CommentCreateResponse {
  /** ID созданного комментария */
  comment_id?: string;
}

getInfo() - Подробная информация

interface ReviewInfo {
  id: string;
  sku: number;
  text: string;
  rating: number;
  published_at: string;
  status: 'UNPROCESSED' | 'PROCESSED';
  comments_amount: number;
  likes_amount: number;
  dislikes_amount: number;
  photos_amount: number;
  videos_amount: number;
  photos: ReviewPhoto[];
  videos: ReviewVideo[];
}

💡 Практические примеры

Автоматическая обработка отзывов

const autoProcessReviews = async () => {
  try {
    // Получить необработанные отзывы
    const reviews = await client.review.getList({
      limit: 100,
      status: 'UNPROCESSED'
    });

    const results = {
      processed: 0,
      positive: 0,
      negative: 0,
      withMedia: 0
    };

    for (const review of reviews.reviews || []) {
      // Анализ отзыва
      const isPositive = review.rating >= 4;
      const hasMedia = review.photos_amount > 0 || review.videos_amount > 0;
      
      if (hasMedia) results.withMedia++;
      if (isPositive) results.positive++;
      else results.negative++;

      // Персонализированный ответ
      let responseText = '';
      
      if (isPositive) {
        responseText = hasMedia 
          ? 'Благодарим за подробный отзыв с фото! Ваше мнение очень важно для нас. 📸✨'
          : 'Спасибо за положительную оценку! Рады, что товар вам понравился! 😊';
      } else {
        responseText = 'Благодарим за ваш отзыв. Мы внимательно изучили ваши замечания и учтем их для улучшения качества. 🔧';
      }

      // Создать комментарий
      await client.review.createComment({
        review_id: review.id,
        text: responseText,
        mark_review_as_processed: true
      });

      results.processed++;
      
      // Пауза между запросами
      await new Promise(resolve => setTimeout(resolve, 1000));
    }

    return results;

  } catch (error) {
    console.error('❌ Ошибка автообработки:', error);
  }
};

Аналитика отзывов

const analyzeReviews = async () => {
  try {
    // Получить счетчики
    const counts = await client.review.getCount();
    
    // Получить все отзывы для анализа
    const allReviews = await client.review.getList({
      limit: 100,
      status: 'ALL'
    });

    const analytics = {
      total: counts.total || 0,
      processed: counts.processed || 0,
      unprocessed: counts.unprocessed || 0,
      rating: {
        5: 0, 4: 0, 3: 0, 2: 0, 1: 0
      },
      withPhotos: 0,
      withVideos: 0,
      withComments: 0
    };

    // Анализ по рейтингам и медиа
    allReviews.reviews?.forEach(review => {
      analytics.rating[review.rating as keyof typeof analytics.rating]++;
      
      if (review.photos_amount > 0) analytics.withPhotos++;
      if (review.videos_amount > 0) analytics.withVideos++;
      if (review.comments_amount > 0) analytics.withComments++;
    });

    return analytics;

  } catch (error) {
    console.error('❌ Ошибка аналитики:', error);
  }
};
4.7
Средний рейтинг
1,247
Всего отзывов
89%
Обработанных
234
С медиа
5⭐
687 (55%)
4⭐
312 (25%)
3⭐
149 (12%)
2⭐
62 (5%)
1⭐
37 (3%)

Управление комментариями

const manageComments = async (reviewId: string) => {
  try {
    // 1. Получить список комментариев
    const comments = await client.review.getCommentList({
      review_id: reviewId,
      limit: 50,
      sort_dir: 'ASC'
    });

    console.log(`💬 Комментариев к отзыву: ${comments.comments?.length || 0}`);

    // 2. Показать диалог
    comments.comments?.forEach((comment, index) => {
      const author = comment.is_owner ? '🏪 Продавец' : '👤 Покупатель';
      console.log(`${index + 1}. ${author}: ${comment.text}`);
      console.log(`   📅 ${comment.published_at}`);
      if (comment.parent_comment_id) {
        console.log(`   ↳ Ответ на комментарий ${comment.parent_comment_id}`);
      }
    });

    // 3. Ответить на последний комментарий покупателя
    const lastCustomerComment = comments.comments?.reverse().find(c => !c.is_owner);
    
    if (lastCustomerComment) {
      const reply = await client.review.createComment({
        review_id: reviewId,
        text: 'Спасибо за дополнение к отзыву!',
        parent_comment_id: lastCustomerComment.id
      });
      
      console.log(`✅ Ответ создан: ${reply.comment_id}`);
    }

  } catch (error) {
    console.error('❌ Ошибка управления комментариями:', error);
  }
};

⚠️ Ограничения и особенности

🔒Доступность

  • Только для Premium Plus - API недоступен для базовых тарифов
  • Полный доступ к отзывам и комментариям
  • Расширенная аналитика и статистика

📊Лимиты и пагинация

  • Размер страницы: 20-100 отзывов за запрос
  • Пагинация: через last_id (курсор)
  • Rate limiting: стандартные лимиты API OZON

🏷️Статусы отзывов

UNPROCESSED - новые отзывы PROCESSED - обработанные отзывы

Автоматическая смена статуса при создании комментария с mark_review_as_processed: true

💬Комментарии

  • ✅ Многоуровневые ответы (через parent_comment_id)
  • ✅ Различение комментариев продавца и покупателя
  • ❌ Нельзя редактировать комментарии, только удалять
  • ✅ Модерация комментариев перед публикацией

📸Медиа в отзывах

  • 📸 Фото: ссылки с размерами
  • 🎥 Видео: основной файл + превью
  • ❌ Нельзя добавлять медиа через API (только просмотр)

💡 Совет профессионала

Review API идеально подходит для создания автоматизированных систем работы с отзывами. Используйте персонализированные ответы и регулярный мониторинг для повышения лояльности клиентов.