Brand API - Управление брендами

Brand API предоставляет доступ к информации о брендах и их сертификационных требованиях в системе OZON. Позволяет получить список брендов, которые требуют предоставления сертификатов.

Обзор API

Количество методов: 1
Основные функции: Получение списка брендов с требованиями к сертификации
Область применения: Соответствие требованиям брендов, управление сертификацией

Методы

1. Получение списка сертифицируемых брендов

Метод: getCertificationList()
Эндпоинт: POST /v1/brand/company-certification/list

Получает список брендов, для которых требуется предоставить сертификат. Ответ содержит только те бренды, товары которых присутствуют в вашем личном кабинете.

Параметры запроса

interface BrandCertificationListRequest {
  page?: number;      // Номер страницы (по умолчанию 1)
  page_size?: number; // Количество элементов на странице
}

Пример использования

import { OzonSellerApiClient } from '@spacechemical/ozon-seller-api';

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

// Получить список брендов с требованиями к сертификации
const brands = await client.brand.getCertificationList({
  page: 1,
  page_size: 100
});

console.log(`Всего брендов в каталоге: ${brands.result?.total}`);

// Найти бренды, требующие сертификацию
const brandsRequiringCerts = brands.result?.brand_certification?.filter(
  brand => brand.has_certificate
);

console.log(`Брендов, требующих сертификацию: ${brandsRequiringCerts?.length}`);

// Вывести информацию о каждом бренде
brands.result?.brand_certification?.forEach(brand => {
  console.log(`
    Бренд: ${brand.brand_name}
    Требует сертификат: ${brand.has_certificate ? 'Да' : 'Нет'}
    ID бренда: ${brand.brand_id}
  `);
  
  if (brand.has_certificate) {
    console.log(`  ⚠️ Требуется предоставить сертификат для бренда ${brand.brand_name}`);
  }
});

Структура ответа

interface BrandCertificationListResponse {
  result?: {
    brand_certification?: Array<{
      brand_id?: number;        // ID бренда
      brand_name?: string;      // Название бренда
      has_certificate?: boolean; // Требуется ли сертификат
    }>;
    total?: number;             // Общее количество брендов
  };
}

Практические сценарии использования

1. Аудит соответствия брендовым требованиям

async function auditBrandCompliance(client: OzonSellerApiClient) {
  const allBrands: any[] = [];
  let page = 1;
  const pageSize = 100;
  
  // Получаем все бренды с пагинацией
  while (true) {
    const response = await client.brand.getCertificationList({
      page,
      page_size: pageSize
    });
    
    if (!response.result?.brand_certification?.length) {
      break;
    }
    
    allBrands.push(...response.result.brand_certification);
    
    // Если получили меньше, чем размер страницы - это последняя страница
    if (response.result.brand_certification.length < pageSize) {
      break;
    }
    
    page++;
  }
  
  // Анализ соответствия
  const brandsRequiringCerts = allBrands.filter(brand => brand.has_certificate);
  const brandsWithoutCertReqs = allBrands.filter(brand => !brand.has_certificate);
  
  const complianceReport = {
    total_brands: allBrands.length,
    brands_requiring_certs: brandsRequiringCerts.length,
    brands_without_cert_reqs: brandsWithoutCertReqs.length,
    compliance_rate: allBrands.length > 0 
      ? ((brandsWithoutCertReqs.length / allBrands.length) * 100).toFixed(1)
      : 0,
    critical_brands: brandsRequiringCerts
  };
  
  console.log('📋 Отчет о соответствии брендовым требованиям:');
  console.log(`Всего брендов в каталоге: ${complianceReport.total_brands}`);
  console.log(`Требуют сертификацию: ${complianceReport.brands_requiring_certs}`);
  console.log(`Не требуют сертификацию: ${complianceReport.brands_without_cert_reqs}`);
  console.log(`Процент соответствия: ${complianceReport.compliance_rate}%`);
  
  if (complianceReport.critical_brands.length > 0) {
    console.log('\\n⚠️ Критические бренды, требующие внимания:');
    complianceReport.critical_brands.forEach(brand => {
      console.log(`  • ${brand.brand_name} (ID: ${brand.brand_id})`);
    });
  }
  
  return complianceReport;
}

2. Мониторинг изменений в требованиях брендов

class BrandComplianceMonitor {
  private lastKnownBrands: Map<number, boolean> = new Map();
  
  constructor(private client: OzonSellerApiClient) {}
  
  async checkForChanges(): Promise<{
    new_requirements: any[];
    removed_requirements: any[];
    unchanged: any[];
  }> {
    // Получаем текущее состояние брендов
    const currentBrands = await this.getAllBrands();
    const currentRequirements = new Map<number, boolean>();
    
    currentBrands.forEach(brand => {
      if (brand.brand_id) {
        currentRequirements.set(brand.brand_id, brand.has_certificate || false);
      }
    });
    
    const changes = {
      new_requirements: [] as any[],
      removed_requirements: [] as any[],
      unchanged: [] as any[]
    };
    
    // Анализируем изменения
    for (const [brandId, requiresCert] of currentRequirements) {
      const previousRequirement = this.lastKnownBrands.get(brandId);
      const brand = currentBrands.find(b => b.brand_id === brandId);
      
      if (previousRequirement === undefined) {
        // Новый бренд
        if (requiresCert) {
          changes.new_requirements.push(brand);
        } else {
          changes.unchanged.push(brand);
        }
      } else if (previousRequirement !== requiresCert) {
        // Изменение требований
        if (requiresCert) {
          changes.new_requirements.push(brand);
        } else {
          changes.removed_requirements.push(brand);
        }
      } else {
        // Без изменений
        changes.unchanged.push(brand);
      }
    }
    
    // Обновляем состояние
    this.lastKnownBrands = currentRequirements;
    
    // Уведомления об изменениях
    if (changes.new_requirements.length > 0) {
      console.log('🚨 Новые требования к сертификации:');
      changes.new_requirements.forEach(brand => {
        console.log(`  • ${brand.brand_name}: теперь требует сертификат`);
      });
    }
    
    if (changes.removed_requirements.length > 0) {
      console.log('✅ Сняты требования к сертификации:');
      changes.removed_requirements.forEach(brand => {
        console.log(`  • ${brand.brand_name}: больше не требует сертификат`);
      });
    }
    
    return changes;
  }
  
  private async getAllBrands() {
    const allBrands: any[] = [];
    let page = 1;
    const pageSize = 100;
    
    while (true) {
      const response = await this.client.brand.getCertificationList({
        page,
        page_size: pageSize
      });
      
      if (!response.result?.brand_certification?.length) break;
      
      allBrands.push(...response.result.brand_certification);
      
      if (response.result.brand_certification.length < pageSize) break;
      page++;
    }
    
    return allBrands;
  }
  
  async startMonitoring(intervalMinutes: number = 60) {
    console.log(`🔍 Начинаем мониторинг изменений брендовых требований (интервал: ${intervalMinutes} мин)`);
    
    // Первоначальная загрузка
    await this.checkForChanges();
    
    // Периодическая проверка
    setInterval(async () => {
      try {
        await this.checkForChanges();
      } catch (error) {
        console.error('Ошибка при проверке изменений брендов:', error.message);
      }
    }, intervalMinutes * 60 * 1000);
  }
}

// Использование монитора
const monitor = new BrandComplianceMonitor(client);
await monitor.startMonitoring(60); // Проверка каждый час

3. Интеграция с системой сертификации товаров

async function integrateBrandRequirementsWithProducts(
  client: OzonSellerApiClient
) {
  // Получаем бренды с требованиями к сертификации
  const brands = await client.brand.getCertificationList({
    page: 1,
    page_size: 1000
  });
  
  const criticalBrands = brands.result?.brand_certification
    ?.filter(brand => brand.has_certificate)
    ?.map(brand => ({
      id: brand.brand_id,
      name: brand.brand_name
    })) || [];
  
  if (criticalBrands.length === 0) {
    console.log('✅ Нет брендов, требующих сертификацию');
    return { critical_brands: [], actions_required: [] };
  }
  
  // Для каждого критического бренда составляем план действий
  const actionsRequired = criticalBrands.map(brand => ({
    brand_id: brand.id,
    brand_name: brand.name,
    actions: [
      {
        priority: 'HIGH',
        action: 'Получить сертификат соответствия',
        deadline: '30 дней',
        description: `Необходимо получить сертификат для бренда ${brand.name}`
      },
      {
        priority: 'MEDIUM',
        action: 'Обновить карточки товаров',
        deadline: '7 дней после получения сертификата',
        description: 'Добавить информацию о сертификате в карточки товаров'
      },
      {
        priority: 'LOW',
        action: 'Мониторинг соответствия',
        deadline: 'Постоянно',
        description: 'Регулярно проверять актуальность сертификата'
      }
    ]
  }));
  
  console.log(`🎯 План действий по ${criticalBrands.length} брендам:`);
  actionsRequired.forEach((brandPlan, index) => {
    console.log(`\\n${index + 1}. ${brandPlan.brand_name}:`);
    brandPlan.actions.forEach(action => {
      const priority = action.priority === 'HIGH' ? '🔴' : 
                       action.priority === 'MEDIUM' ? '🟡' : '🟢';
      console.log(`   ${priority} ${action.action} (${action.deadline})`);
      console.log(`      ${action.description}`);
    });
  });
  
  return {
    critical_brands: criticalBrands,
    actions_required: actionsRequired
  };
}

4. Автоматизация уведомлений

class BrandNotificationSystem {
  constructor(private client: OzonSellerApiClient) {}
  
  async sendComplianceAlerts(webhookUrl?: string) {
    try {
      const brands = await client.brand.getCertificationList({
        page: 1,
        page_size: 1000
      });
      
      const criticalBrands = brands.result?.brand_certification
        ?.filter(brand => brand.has_certificate) || [];
      
      if (criticalBrands.length === 0) {
        console.log('✅ Все бренды соответствуют требованиям');
        return;
      }
      
      const alert = {
        timestamp: new Date().toISOString(),
        level: 'WARNING',
        message: `Обнаружено ${criticalBrands.length} брендов, требующих сертификацию`,
        brands: criticalBrands.map(brand => ({
          name: brand.brand_name,
          id: brand.brand_id,
          action_required: 'Предоставить сертификат соответствия'
        }))
      };
      
      // Консольное уведомление
      console.log('🚨 УВЕДОМЛЕНИЕ О СООТВЕТСТВИИ БРЕНДАМ:');
      console.log(`Дата: ${alert.timestamp}`);
      console.log(`Статус: ${alert.message}`);
      console.log('Требуют внимания:');
      alert.brands.forEach(brand => {
        console.log(`  • ${brand.name} (ID: ${brand.id})`);
      });
      
      // Отправка веб-хука (если настроен)
      if (webhookUrl) {
        try {
          const response = await fetch(webhookUrl, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(alert)
          });
          
          if (response.ok) {
            console.log('✅ Уведомление отправлено на webhook');
          } else {
            console.warn('⚠️ Ошибка отправки webhook:', response.statusText);
          }
        } catch (error) {
          console.error('❌ Ошибка webhook:', error.message);
        }
      }
      
      return alert;
    } catch (error) {
      console.error('Ошибка при отправке уведомлений:', error.message);
      return null;
    }
  }
  
  async scheduleRegularChecks(intervalHours: number = 24, webhookUrl?: string) {
    console.log(`📅 Настроена регулярная проверка брендовых требований каждые ${intervalHours} часов`);
    
    // Первоначальная проверка
    await this.sendComplianceAlerts(webhookUrl);
    
    // Регулярные проверки
    setInterval(async () => {
      await this.sendComplianceAlerts(webhookUrl);
    }, intervalHours * 60 * 60 * 1000);
  }
}

// Использование системы уведомлений
const notificationSystem = new BrandNotificationSystem(client);

// Единоразовая проверка
await notificationSystem.sendComplianceAlerts();

// Регулярные проверки с webhook
await notificationSystem.scheduleRegularChecks(12, 'https://your-webhook-url.com/ozon-alerts');

Важные особенности

Динамичность списка брендов

  • Список брендов может изменяться при получении новых требований от правообладателей
  • Рекомендуется регулярно проверять изменения в требованиях
  • Бренды могут как добавляться в список требующих сертификацию, так и удаляться из него

Рекомендации по использованию

// Правильный подход с обработкой пагинации
async function getAllBrands(client: OzonSellerApiClient) {
  const allBrands: any[] = [];
  let page = 1;
  const pageSize = 100; // Оптимальный размер страницы
  
  while (true) {
    try {
      const response = await client.brand.getCertificationList({
        page,
        page_size: pageSize
      });
      
      if (!response.result?.brand_certification?.length) {
        break; // Нет больше данных
      }
      
      allBrands.push(...response.result.brand_certification);
      
      // Если получили меньше чем размер страницы - последняя страница
      if (response.result.brand_certification.length < pageSize) {
        break;
      }
      
      page++;
      
      // Небольшая пауза между запросами для соблюдения rate limits
      await new Promise(resolve => setTimeout(resolve, 100));
    } catch (error) {
      console.error(`Ошибка при загрузке страницы ${page}:`, error.message);
      break;
    }
  }
  
  return allBrands;
}

Обработка ошибок

try {
  const brands = await client.brand.getCertificationList({
    page: 1,
    page_size: 100
  });
  
  if (!brands.result) {
    console.warn('Пустой результат от API');
    return;
  }
  
  // Обработка данных...
} catch (error) {
  if (error.response?.status === 400) {
    console.error('Неверные параметры запроса:', error.response.data);
  } else if (error.response?.status === 429) {
    console.error('Превышен лимит запросов, повторите позже');
  } else if (error.response?.status === 500) {
    console.error('Внутренняя ошибка сервера, попробуйте позже');
  } else {
    console.error('Произошла ошибка:', error.message);
  }
}

Связанные API: Certification API (управление сертификатами), Product API (управление товарами), Report API (отчеты по соответствию)