Ozon APIozon.kz ↗
Access Ozon.kz product listings, prices, reviews, seller info, and category trees via a structured REST API. 7 endpoints, no scraping setup required.
What is the Ozon API?
The Ozon.kz API provides 7 endpoints for retrieving product data, category listings, seller details, and customer reviews from Kazakhstan's Ozon marketplace. The get_product_details endpoint returns 10 response fields including price, discount, original_price, rating, seller object, characteristics array, and review count — covering the core data points needed for price monitoring, catalog research, or competitive analysis.
curl -X GET 'https://api.parse.bot/scraper/8a36349f-b05d-4ec3-af65-3bf4796273bd/search_products' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace ozon-kz-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Ozon.kz Catalog API Client
A Python client for searching products, retrieving details, browsing categories,
and more on Ozon.kz.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Any, Dict, List, Optional
class ParseClient:
"""Client for interacting with the Ozon.kz Catalog API via Parse Bot."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "3181e6fd-238a-49a5-986f-96065147b60f"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key not provided and PARSE_API_KEY environment variable not set")
def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
"""
Make a request to the Parse API.
Args:
endpoint: The API endpoint name
method: HTTP method (GET or POST)
**params: Parameters to pass to the endpoint
Returns:
Response data as dictionary
Raises:
requests.RequestException: If the API request fails
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
if method == "GET":
response = requests.get(url, headers=headers, params=params)
elif method == "POST":
response = requests.post(url, headers=headers, json=params)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def search_products(
self,
query: str,
sort: str = "score",
page: int = 1
) -> Dict[str, Any]:
"""
Search for products by keyword with optional sorting.
Args:
query: Search query string
sort: Sort order (score, price_asc, price_desc, rating, discount)
page: Page number for pagination
Returns:
Dictionary containing products list and page number
"""
return self._call(
"search_products",
method="GET",
query=query,
sort=sort,
page=page
)
def get_product_details(self, product_id: str) -> Dict[str, Any]:
"""
Get detailed information for a specific product.
Args:
product_id: Product ID (SKU) or URL slug
Returns:
Dictionary containing detailed product information
"""
return self._call(
"get_product_details",
method="GET",
product_id=product_id
)
def get_category_listing(self, category_id: str, page: int = 1) -> Dict[str, Any]:
"""
Browse products in a specific category.
Args:
category_id: Category ID or path slug
page: Page number for pagination
Returns:
Dictionary containing products in the category and page number
"""
return self._call(
"get_category_listing",
method="GET",
category_id=category_id,
page=page
)
def get_category_tree(self) -> Dict[str, Any]:
"""
Retrieve the category tree for the catalog menu.
Returns:
Dictionary containing nested category structure
"""
return self._call("get_category_tree", method="GET")
def get_product_reviews(self, product_id: str, page: int = 1) -> Dict[str, Any]:
"""
Get customer reviews for a specific product.
Args:
product_id: Product SKU ID
page: Page number for pagination
Returns:
Dictionary containing reviews list and page number
"""
return self._call(
"get_product_reviews",
method="GET",
product_id=product_id,
page=page
)
def get_seller_info(self, seller_id: str) -> Dict[str, Any]:
"""
Get information about a specific seller.
Args:
seller_id: Seller ID or slug
Returns:
Dictionary containing seller name and rating
"""
return self._call(
"get_seller_info",
method="GET",
seller_id=seller_id
)
def get_search_suggestions(self, query: str) -> Dict[str, Any]:
"""
Get autocomplete suggestions for a search query.
Args:
query: Partial search term
Returns:
Dictionary containing suggestion list
"""
return self._call(
"get_search_suggestions",
method="GET",
query=query
)
if __name__ == "__main__":
# Initialize the client
client = ParseClient()
print("=" * 80)
print("OZON.KZ CATALOG API - PRACTICAL USAGE EXAMPLE")
print("=" * 80)
# Step 1: Get search suggestions
print("\n📝 Step 1: Getting search suggestions for 'iphone'...")
suggestions_response = client.get_search_suggestions("iphone")
if suggestions_response.get("suggestions"):
suggestions = [s["text"] for s in suggestions_response["suggestions"]]
print(f" Found suggestions: {suggestions[:3]}") # Show first 3
# Step 2: Search for products
search_query = "iPhone 15"
print(f"\n🔍 Step 2: Searching for '{search_query}'...")
search_results = client.search_products(query=search_query, sort="rating", page=1)
if search_results.get("products"):
products = search_results["products"]
print(f" Found {len(products)} products on page {search_results['page']}")
# Step 3: Get details for the top 2 products and their reviews
print(f"\n📦 Step 3: Getting details and reviews for top products...")
for idx, product in enumerate(products[:2], 1):
product_id = product["id"]
product_name = product["name"]
print(f"\n Product {idx}: {product_name}")
print(f" Price: {product['price']} (Original: {product.get('original_price', 'N/A')})")
print(f" Discount: {product.get('discount', 'None')}")
print(f" Rating: {product['rating']} ⭐ ({product['reviews_count']} reviews)")
# Get detailed information
try:
details = client.get_product_details(product_id)
print(f" Description: {details.get('description', 'N/A')[:100]}...")
# Get seller information
if details.get("seller"):
seller = details["seller"]
seller_info = client.get_seller_info(seller["id"])
print(f" Seller: {seller['name']} (Rating: {seller_info.get('rating', 'N/A')})")
# Get product reviews
reviews_response = client.get_product_reviews(product_id, page=1)
if reviews_response.get("reviews"):
reviews = reviews_response["reviews"]
print(f" Recent reviews ({len(reviews)} shown):")
for review in reviews[:2]:
print(f" - {review['author']}: {review['content'][:60]}... ({review['score']}⭐)")
except Exception as e:
print(f" Error getting details: {e}")
# Step 4: Browse a category
print(f"\n🏷️ Step 4: Browsing Electronics category...")
try:
category_tree = client.get_category_tree()
if category_tree.get("data"):
# Find Electronics category
for category in category_tree["data"][:2]:
print(f" Found category: {category['name']} (ID: {category['id']})")
if category.get("subcategories"):
for subcat in category["subcategories"][:2]:
print(f" └─ {subcat['name']}")
except Exception as e:
print(f" Error getting category tree: {e}")
print("\n" + "=" * 80)
print("✅ Example workflow completed!")
print("=" * 80)Search for products by keyword with optional sorting
| Param | Type | Description |
|---|---|---|
| page | integer | Page number |
| sort | string | Sort order: score, price_asc, price_desc, rating, discount |
| queryrequired | string | Search query |
{
"type": "object",
"fields": {
"page": "string",
"products": "array"
},
"sample": {
"page": "1",
"products": [
{
"id": "123456789",
"url": "https://ozon.kz/product/iphone-15-128gb-black-123456789/",
"name": "iPhone 15 128GB Black",
"price": "350000 ₸",
"rating": "4.9",
"discount": "-30%",
"reviews_count": 150,
"original_price": "500000 ₸"
}
]
}
}About the Ozon API
Product Search and Discovery
The search_products endpoint accepts a required query string and returns a paginated products array alongside a page field. Results can be sorted using the sort parameter, which accepts score, price_asc, price_desc, rating, or discount — useful for surfacing cheapest listings or highest-rated items for a given search term. The get_search_suggestions endpoint takes a partial search term and returns a suggestions array, enabling autocomplete or query expansion workflows.
Product Details and Reviews
get_product_details accepts either a product SKU or a URL slug as product_id and returns structured fields: name, price, original_price, discount, rating, description, images (array), characteristics (array of attribute-value pairs), reviews_count, and a seller object. The get_product_reviews endpoint takes a product_id (SKU) and an optional page number, returning a reviews array with paginated customer feedback.
Category Browsing
get_category_tree requires no inputs and returns the full catalog hierarchy as a data array — useful for mapping Ozon.kz's category structure before building a crawler or feed importer. get_category_listing accepts a category_id (either a numeric ID or a path slug) and optional page, returning a products array scoped to that category.
Seller Information
get_seller_info accepts a seller_id or slug and returns the seller's name and rating. This is the only seller-focused endpoint; detailed storefront metrics such as fulfillment speed or review breakdown are not exposed, but the seller object embedded in get_product_details provides a quick reference to the associated seller per product.
The Ozon API is a managed, monitored endpoint for ozon.kz — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when ozon.kz changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official ozon.kz API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor price and discount changes across Ozon.kz product listings using price, original_price, and discount fields.
- Build a product feed for comparison shopping by querying search_products with multiple keywords and extracting name, price, and rating.
- Aggregate customer sentiment by pulling reviews arrays from get_product_reviews for a set of product SKUs.
- Map the full Ozon.kz catalog structure with get_category_tree to seed a category-level crawl.
- Evaluate seller credibility by combining the seller object from product details with the rating from get_seller_info.
- Power an autocomplete feature using get_search_suggestions with partial search terms.
- Track product characteristics (e.g. brand, material, size) across a category using the characteristics array in get_product_details.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.