Reserved APIreserved.com ↗
Access Reserved.com's full product catalog, category tree, keyword search, detailed product info, and in-store stock availability via 6 structured endpoints.
What is the Reserved API?
The Reserved.com API exposes 6 endpoints covering the full shopping experience on reserved.com, including category discovery, paginated product listings, keyword search, and per-SKU detail pages. The list_products endpoint supports filtering by size, color, and price range in HUF, while check_store_availability returns physical store stock status for a given product and size ID. Data covers Reserved Hungary's catalog with fields like SKU, pricing, color options, features, and ratings.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/0216d37e-57d9-471f-9b8b-dc6e4c2e809f/get_homepage' \ -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 reserved-com-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.
"""
Reserved Hungary API Client using Parse
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Any, Optional
class ParseClient:
"""Client for interacting with Reserved Hungary API through Parse."""
def __init__(self, api_key: Optional[str] = None):
"""Initialize the Parse client with API credentials."""
self.base_url = "https://api.parse.bot"
self.scraper_id = "0216d37e-57d9-471f-9b8b-dc6e4c2e809f"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError(
"API key not provided. Set PARSE_API_KEY environment variable "
"or pass api_key parameter."
)
def _call(self, endpoint: str, method: str = "POST", **params) -> dict:
"""Make API call to Parse endpoint."""
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 get_homepage(self) -> dict:
"""Fetch the Reserved Hungary homepage information and promotional banners."""
return self._call("get_homepage", method="GET")
def list_categories(self) -> dict:
"""Return the full category tree with IDs, names, URLs, and nested children."""
return self._call("list_categories", method="GET")
def list_products(
self,
category_id: str,
page: int = 0,
limit: int = 200,
sort_by: Optional[str] = None,
min_price: Optional[int] = None,
max_price: Optional[int] = None,
colors: Optional[str] = None,
sizes: Optional[str] = None
) -> dict:
"""
List products in a given category with pagination and filtering.
Args:
category_id: Category ID from list_categories
page: Zero-based page index (default: 0)
limit: Number of results per page (default: 200)
sort_by: Sort order ID
min_price: Minimum price filter in HUF
max_price: Maximum price filter in HUF
colors: Comma-separated color slugs
sizes: Comma-separated size slugs
Returns:
Product list with pagination info
"""
params = {
"category_id": category_id,
"page": page,
"limit": limit
}
if sort_by:
params["sort_by"] = sort_by
if min_price is not None:
params["min_price"] = min_price
if max_price is not None:
params["max_price"] = max_price
if colors:
params["colors"] = colors
if sizes:
params["sizes"] = sizes
return self._call("list_products", method="GET", **params)
def search_products(
self,
query: str,
page: int = 0,
limit: int = 20
) -> dict:
"""
Search for products across all categories.
Args:
query: Search keyword
page: Zero-based page index (default: 0)
limit: Number of results per page (default: 20)
Returns:
Search results from Algolia index
"""
return self._call(
"search_products",
method="GET",
query=query,
page=page,
limit=limit
)
def get_product_detail(self, sku: str) -> dict:
"""
Fetch detailed product information by SKU.
Args:
sku: Product SKU (e.g., '334HK-00X')
Returns:
Detailed product information
"""
return self._call("get_product_detail", method="GET", sku=sku)
def check_store_availability(
self,
product_id: str,
size_id: str,
location: str = "Budapest"
) -> dict:
"""
Check availability of a specific product size in physical stores.
Args:
product_id: Numeric product ID
size_id: Numeric size ID
location: City or location string (default: "Budapest")
Returns:
Availability status and store details
"""
return self._call(
"check_store_availability",
method="POST",
product_id=product_id,
size_id=size_id,
location=location
)
def main():
"""Practical workflow demonstrating API usage."""
client = ParseClient()
print("=" * 60)
print("Reserved Hungary API - Practical Workflow")
print("=" * 60)
# Step 1: Get homepage info
print("\n1. Fetching homepage information...")
homepage = client.get_homepage()
if homepage.get("status") == "success":
homepage_data = homepage.get("data", {})
print(f" Status: {homepage_data.get('status')}")
print(f" Title: {homepage_data.get('title')}")
print(f" Banners found: {len(homepage_data.get('banners', []))}")
# Step 2: Get categories
print("\n2. Fetching product categories...")
categories_response = client.list_categories()
categories_data = categories_response.get("data", {})
categories = categories_data.get("categories", [])
print(f" Found {len(categories)} top-level categories")
# Find Women's category
women_category = None
for cat in categories:
if cat.get("system_name") == "WOMAN":
women_category = cat
break
if women_category:
print(f" Women's category ID: {women_category.get('id')}")
print(f" Women's subcategories: {len(women_category.get('children', []))}")
# Step 3: Search for a specific product
print("\n3. Searching for 'ruha' (dress)...")
search_response = client.search_products(query="ruha", limit=5)
search_data = search_response.get("data", {})
results = search_data.get("results", [])
if results and results[0].get("hits"):
hits = results[0]["hits"]
print(f" Found {results[0].get('nbHits')} total results")
print(f" Displaying {len(hits)} results on this page:")
# Get details for first search result
if hits:
first_hit = hits[0]
sku = first_hit.get("sku")
product_name = first_hit.get("name")
price = first_hit.get("final_price")
print(f"\n4. Getting detailed info for: {product_name}")
try:
detail_response = client.get_product_detail(sku=sku)
detail_data = detail_response.get("data", {})
print(f" SKU: {detail_data.get('sku')}")
print(f" Price: {detail_data.get('final_price')} HUF")
print(f" Available sizes: {', '.join(detail_data.get('sizes', []))}")
description = detail_data.get("description", "")
if description:
print(f" Description: {description[:100]}...")
features = detail_data.get("features", {})
if features:
print(f" Features:")
for feature_key, feature_values in list(features.items())[:2]:
print(f" - {feature_key}: {', '.join(feature_values)}")
except Exception as e:
print(f" Error fetching product details: {e}")
# Step 5: List products from Women's category
if women_category:
print(f"\n5. Listing products from Women's category...")
women_cat_id = women_category.get("id")
products_response = client.list_products(
category_id=women_cat_id,
page=0,
limit=3
)
products_data = products_response.get("data", {})
products = products_data.get("products", [])
total = products_data.get("productsTotalAmount", 0)
print(f" Total products in category: {total}")
print(f" Showing {len(products)} on this page:")
for product in products:
name = product.get("name")
sku = product.get("sku")
price = product.get("final_price", product.get("price"))
has_discount = product.get("has_discount", False)
discount_indicator = " (DISCOUNTED!)" if has_discount else ""
print(f" - {name} ({sku}): {price} HUF{discount_indicator}")
print("\n" + "=" * 60)
print("Workflow complete!")
print("=" * 60)
if __name__ == "__main__":
main()Fetches the Reserved Hungary homepage information and promotional banner URLs extracted from the page.
No input parameters required.
{
"type": "object",
"fields": {
"url": "string homepage URL",
"title": "string site title",
"status": "string indicating site availability",
"banners": "array of promotional and product page URLs found on the homepage"
},
"sample": {
"data": {
"url": "https://www.reserved.com/hu/hu/",
"title": "Reserved Hungary",
"status": "online",
"banners": [
"https://www.reserved.com/hu/hu/",
"https://www.reserved.com/hu/hu/balloon-nadrag-modallal-2-938jj-01x",
"https://www.reserved.com/hu/hu/borben-gazdag-papucs-623ie-99x"
]
},
"status": "success"
}
}About the Reserved API
Category and Product Discovery
Start with list_categories to retrieve the full category tree. Each category object includes an id, name, url, and nested children array, so you can traverse the hierarchy to find the category_id values needed by list_products. For example, category ID 239 maps to Women's. list_products accepts that ID along with optional filters: sizes (comma-separated slugs like s,m,l), colors, min_price, max_price (both in HUF), and sort_by. The response includes products (an array of summary objects with id, name, sku, price, images, sizes, and colorOptions), plus productsAmount and productsTotalAmount for pagination tracking.
Search and Product Detail
search_products accepts a query string and returns Algolia-backed results. The response structure mirrors Algolia's multi-index format: an array of result objects each containing hits, nbHits, nbPages, page, and query. Pagination is zero-based via the page parameter. For full product data, pass a SKU string to get_product_detail to retrieve description, a features object (mapping feature category names to arrays of values), final_price, regular_price, currency, color_options, and sizes. This endpoint is the appropriate source for sale pricing since it exposes both regular and final price fields.
Store Availability
check_store_availability takes a numeric product_id and size_id (both sourced from product detail or list responses) and an optional location string to target nearby stores. The response includes a boolean status and, when available, store detail objects. Note that the upstream service occasionally returns a Hungarian-language technical error (Technikai probléma); in those cases status will be false and a message field will be present. The get_homepage endpoint returns the site title, a status indicator, and an array of promotional banners URLs extracted from the homepage, useful for tracking active campaigns.
The Reserved API is a managed, monitored endpoint for reserved.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when reserved.com 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 reserved.com 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?+
- Build a price comparison tool using
final_priceandregular_pricefields to surface discounted Reserved items - Sync Reserved's product catalog into an internal database using
list_categoriesand paginatedlist_productscalls - Power a size-and-color filtered product feed by combining the
sizesandcolorsparams inlist_products - Check real-time in-store stock for a specific SKU and size before recommending a store visit via
check_store_availability - Implement keyword search across all Reserved categories using
search_productswith Algolia-backed hit counts - Track promotional campaign URLs over time by polling the
bannersarray returned byget_homepage - Extract structured garment attributes from the
featuresobject inget_product_detailto enrich product metadata
| 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.
Does Reserved.com have an official public developer API?+
What does `list_products` return and how do I filter results?+
list_products returns an array of product summary objects per page, each containing id, name, sku, price, images, sizes, and colorOptions, along with productsAmount and productsTotalAmount. You can filter by passing sizes (e.g. s,m,l), colors, min_price, or max_price as optional parameters alongside the required category_id. Pagination is zero-based via the page parameter.What happens when `check_store_availability` returns an error?+
status: false and a message field containing the Hungarian-language error string Technikai probléma. Your integration should handle this case by checking the status boolean before consuming store detail objects.Does the API cover Reserved stores outside Hungary, such as Poland or Romania?+
Does the API return customer reviews or ratings for products?+
get_product_detail endpoint includes rating data as part of the product detail response, but there is no endpoint that returns individual user reviews or review text. You can fork this API on Parse and revise it to add a dedicated reviews endpoint if that data is available on the product page.