Интеграция интернет-магазина с Ozon (Seller API)
Ozon Seller API — один из наиболее зрелых API среди российских маркетплейсов. Позволяет управлять товарами, ценами, остатками, получать заказы и управлять их статусами без входа в личный кабинет. Интеграция сайта с Ozon даёт возможность вести продажи на маркетплейсе, синхронизируя данные с основным каталогом.
Аутентификация
$headers = [
'Client-Id' => config('services.ozon.client_id'),
'Api-Key' => config('services.ozon.api_key'),
'Content-Type' => 'application/json',
];
$base = 'https://api-seller.ozon.ru';
Создание/обновление товаров
class OzonProductService
{
public function upsertProduct(Product $product): void
{
$payload = [
'items' => [[
'attributes' => [
['id' => 9048, 'complex_id' => 0, 'values' => [['value' => $product->name]]],
['id' => 4191, 'complex_id' => 0, 'values' => [['value' => $product->brand]]],
['id' => 85, 'complex_id' => 0, 'values' => [['value' => $product->description]]],
],
'barcode' => $product->barcode ?? '',
'description_category_id' => $this->getCategoryId($product),
'name' => $product->name,
'offer_id' => $product->sku,
'price' => (string) $product->price,
'images' => $product->images->pluck('url')->all(),
'vat' => '0.2',
]]
];
$resp = Http::withHeaders($this->headers)
->post("{$this->base}/v3/product/import", $payload);
$taskId = $resp->json('result.task_id');
// Статус создания асинхронный — проверяем по task_id
$this->waitForTask($taskId);
}
private function waitForTask(string $taskId): void
{
for ($i = 0; $i < 30; $i++) {
sleep(2);
$status = Http::withHeaders($this->headers)
->post("{$this->base}/v1/product/import/info", ['task_id' => $taskId])
->json('result.items.0.status');
if ($status === 'imported') return;
if ($status === 'failed') throw new OzonImportException("Task {$taskId} failed");
}
throw new OzonImportException("Task {$taskId} timeout");
}
}
Обновление цен и остатков
public function updatePrices(array $items): void
{
// items: [['offer_id' => 'SKU-123', 'price' => '1990', 'old_price' => '2490']]
Http::withHeaders($this->headers)
->post("{$this->base}/v1/product/import/prices", ['prices' => $items]);
}
public function updateStocks(array $items): void
{
// items: [['offer_id' => 'SKU-123', 'stock' => 15, 'warehouse_id' => 12345]]
Http::withHeaders($this->headers)
->post("{$this->base}/v2/products/stocks", ['stocks' => $items]);
}
Получение заказов
public function getNewOrders(): array
{
$resp = Http::withHeaders($this->headers)
->post("{$this->base}/v3/posting/fbs/list", [
'filter' => [
'since' => now()->subHours(24)->toIso8601String(),
'to' => now()->toIso8601String(),
'status' => 'awaiting_packaging',
],
'limit' => 50,
]);
return $resp->json('result.postings');
}
Статусы заказов FBS
| Статус | Описание |
|---|---|
awaiting_packaging |
Ожидает сборки |
awaiting_deliver |
Ожидает передачи курьеру |
delivering |
В доставке |
delivered |
Доставлен |
cancelled |
Отменён |
Асинхронность API
Ozon активно использует асинхронные задачи: создание товаров, обновление остатков большими батчами. Важно правильно обрабатывать task_id и статусы.
Ограничения API
- Rate limits: 1 000 запросов в минуту для большинства методов
- Батчинг: обновление остатков — до 500 SKU за запрос; цены — до 1 000
Сроки
Интеграция с Ozon Seller API (товары + цены + остатки + заказы): 12–18 рабочих дней.







