Online Store Integration with Ozon Seller API
Imagine you manually update 5000 products on Ozon through the personal account. One employee spends a whole day on this, and tomorrow the stocks drift apart again. Discrepancies lead to order cancellations and fines from the marketplace. According to statistics, up to 15% of orders are cancelled precisely due to outdated stock data. This is a familiar situation for many sellers. We solve it via Ozon Seller API — a single channel for bidirectional synchronization that eliminates the human factor. Our engineers hold Ozon certifications and have over five years of experience in e-commerce integrations. During this time, we have implemented projects with catalogs ranging from 5000 products, where automation reduced manual labor by 120 hours per month, saving the client around 600,000 rubles per year. Contact us for a free audit of your current setup.
What tasks does integration with Ozon solve?
Manual catalog management on the marketplace is a source of problems: outdated prices, duplicated products, stock errors. Automation via Seller API addresses three key tasks:
- Product synchronization: import and export of nomenclature with attributes (name, brand, description, characteristics). Asynchronous import requires proper handling of task_id.
- Price and stock synchronization: real-time updates from your CRM or ERP. We account for rate limits and batching (up to 500 SKUs per request for stocks).
- Order management: receiving new orders, updating statuses (awaiting_packaging → awaiting_deliver → delivered). Integration supports FBS and FBO.
According to the official Ozon documentation, asynchronous tasks require polling of task_id and proper error handling.
Why is automatic synchronization more profitable than manual management?
Manually updating 1000 products takes about 4 hours, while automatic update takes 2 minutes — a 120-fold difference. Additionally, human errors are eliminated: forgetting to update a price means lost profit. Automatic synchronization ensures that data on Ozon is always up-to-date, and orders are not stuck due to outdated stock levels. Moreover, automation allows business scaling without hiring additional staff.
How do we implement synchronization?
We use the Repository pattern to abstract API calls and a task queue for asynchronous operations. On errors (timeout, 429 Too Many Requests), we apply exponential backoff with retries. Laravel 11 with Redis and Horizon allows managing queues without data loss.
Authentication
$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';
Create/Update Products
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');
// Creation status is asynchronous — check via 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");
}
}
Update Prices and Stocks
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]);
}
Get Orders
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');
}
Asynchronicity of API
Ozon actively uses asynchronous tasks: product creation, bulk stock updates. It is crucial to properly handle task_id and statuses. We added automatic retry on failure and Telegram notifications for failures.
When is integration indispensable?
If your catalog exceeds 1000 SKUs or you operate under FBS with frequent stock updates, manual synchronization becomes a bottleneck. Stock errors lead to cancellations — each cancelled order can cost up to 500 rubles in fines plus lost loyalty. Automation pays off within the first few months.
Comparison of Ozon FBS and FBO Schemes
| Parameter | FBS (sell from your own warehouse) | FBO (sell from Ozon warehouse) |
|---|---|---|
| Stock management | You update stocks manually or via API | Ozon controls stocks automatically |
| Delivery speed | Depends on your logistics | Faster, items are already at Ozon warehouse |
| Risk of discrepancies | High with frequent movements | Minimal |
| Cancellation fines | Yes | Yes, but less frequent due to synchronization |
| API methods | /v3/posting/fbs/list, /v2/products/stocks |
Mostly same, but no stock updates |
The choice of scheme depends on your sales model. We help set up integration for any option.
Our Achievements
We have been working with Ozon integrations for over 5 years, implemented 30+ projects for catalogs from 1000 to 100,000 SKUs. Average time savings after automation — 120 hours per month, and reduction of order cancellations — up to 90%. Get a consultation from an engineer — we will evaluate your catalog and tell you how to automate Ozon within 2 weeks.
Process of Integration
- Analytics: we study your catalog, API methods, current processes.
- Design: choose a pattern (synchronous/asynchronous), define field mapping.
- Implementation: write code using Test-Driven Development for critical parts.
- Testing: load testing with simulation of peak loads (e.g., Black Friday).
- Deployment: deploy on your server (Docker, Nginx, PHP 8.3). Train your team to work with the integration.
What is Included in the Work
- Full integration documentation (architecture, endpoints, data schema).
- Setup of monitoring and alerts (API errors, data discrepancies).
- Training of your manager to work with logs and statuses.
- Guarantee of stable operation during the first 30 days after deployment (free support).
Timeline
Basic integration (products + prices + stocks + orders) — from 12 to 18 working days. The timeline can be shortened if an API key is ready and data structure is clear. We will evaluate your project for free — contact us for a consultation.
What typical errors occur during integration and how to avoid them?
There are several pitfalls when integrating with Ozon that we have learned to avoid. First, incorrect category attributes when importing products cause errors. Solution — preliminary request for description_category_id and validation. Second, exceeding rate limits when updating prices causes timeouts. Batching 1000 elements and pausing between requests solves the problem. Third, asynchronicity of stock updates can lead to discrepancies — we use a queue with re-synchronization after each successful update.
FBS Order Statuses
| Status | Description |
|---|---|
awaiting_packaging |
Awaiting packaging |
awaiting_deliver |
Awaiting handover to courier |
delivering |
In delivery |
delivered |
Delivered |
cancelled |
Cancelled |
Contact us for a free audit of your current integration.







