Smyths Toys APIsmythstoys.com ↗
Access the Smyths Toys product catalog via API. Search products by keyword and retrieve pricing, stock, and specs across UK, Ireland, Germany, and Netherlands.
What is the Smyths Toys API?
The Smyths Toys API provides 2 endpoints for querying the Smyths Toys product catalog across four regional locales: UK, Ireland, Germany, and the Netherlands. The search_products endpoint accepts a keyword query and returns a paginated array of matching products, while get_product_details returns structured data including name, price, and stock status for a specific product by its SKU code.
curl -X GET 'https://api.parse.bot/scraper/14f94093-2f34-4248-a287-e5c61542fced/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 smythstoys-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.
"""
Smythstoys API Client
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional, Any, Dict, List
class ParseClient:
"""Client for interacting with the Smythstoys API via Parse."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, uses PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "053661b2-6234-4b41-97da-8dfcb7c7fb9c"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key must be provided or set in PARSE_API_KEY environment variable")
def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
"""
Make an API call to the Parse scraper.
Args:
endpoint: The endpoint name (e.g., 'search_products')
method: HTTP method ('GET' or 'POST')
**params: Query/body parameters for the endpoint
Returns:
Parsed JSON response from the API
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"
}
try:
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params)
elif method.upper() == "POST":
response = requests.post(url, headers=headers, json=params)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
except requests.RequestException as e:
raise Exception(f"API request failed: {str(e)}")
def search_products(
self,
query: str,
locale: str = "uk",
page: int = 0,
page_size: int = 48
) -> Dict[str, Any]:
"""
Search for products by keyword query across different locales.
Args:
query: Search keyword (required)
locale: Region/Locale - one of: uk, ie, de, nl (default: uk)
page: Current page number (default: 0)
page_size: Number of results per page (default: 48)
Returns:
Dictionary containing 'products' array with matching products
"""
return self._call(
"search_products",
method="GET",
query=query,
locale=locale,
page=page,
page_size=page_size
)
def get_product_details(
self,
product_code: str,
locale: str = "uk"
) -> Dict[str, Any]:
"""
Get detailed information for a specific product by its code.
Args:
product_code: Product SKU/Code (e.g., '123456') (required)
locale: Region/Locale - one of: uk, ie, de, nl (default: uk)
Returns:
Dictionary containing product details including name, price, and stock info
"""
return self._call(
"get_product_details",
method="GET",
product_code=product_code,
locale=locale
)
def main():
"""Practical usage example: Search for products and fetch details for each result."""
# Initialize the client
client = ParseClient()
# Search for LEGO products in the UK
print("🔍 Searching for LEGO products in UK...\n")
search_results = client.search_products(
query="LEGO",
locale="uk",
page=0,
page_size=5 # Limit to 5 results for this example
)
products = search_results.get("products", [])
if not products:
print("❌ No products found")
return
print(f"✅ Found {len(products)} products\n")
# Fetch detailed information for each product
print("=" * 70)
print(f"{'Product Name':<40} {'Price':>12} {'Stock Status':>15}")
print("=" * 70)
for product in products:
product_code = product.get("code")
product_name = product.get("name", "Unknown")
if not product_code:
continue
try:
# Get detailed information
details = client.get_product_details(
product_code=product_code,
locale="uk"
)
name = details.get("name", "Unknown")
price_data = details.get("price", {})
price_value = price_data.get("value", "N/A") if isinstance(price_data, dict) else "N/A"
stock_data = details.get("stock", {})
stock_status = stock_data.get("stockLevelStatus", "Unknown") if isinstance(stock_data, dict) else "Unknown"
# Format price
if isinstance(price_value, (int, float)):
price_str = f"£{price_value:.2f}"
else:
price_str = str(price_value)
# Print formatted row
print(f"{name:<40} {price_str:>12} {stock_status:>15}")
except Exception as e:
print(f"{product_name:<40} {'Error':>12} {str(e)[:15]:>15}")
print("=" * 70)
print("\n✨ Product details fetched successfully!")
if __name__ == "__main__":
main()Search for products by keyword query across different locales.
| Param | Type | Description |
|---|---|---|
| page | integer | Current page number |
| queryrequired | string | Search keyword |
| locale | string | Region/Locale (uk, ie, de, nl) |
| page_size | integer | Number of results per page |
{
"type": "object",
"fields": {
"products": "array"
},
"sample": {
"products": [
{
"code": "123456",
"name": "LEGO Star Wars Millennium Falcon",
"price": {
"value": 149.99
}
}
]
}
}About the Smyths Toys API
Search Products
The search_products endpoint accepts a required query string and optional parameters for locale (uk, ie, de, nl), page, and page_size. This lets you paginate through result sets and scope searches to a specific regional market. The response is an array of products, making it suitable for building catalog browsers, comparison tools, or monitoring keyword-based product availability across regions.
Product Details
The get_product_details endpoint takes a required product_code (the Smyths SKU, e.g. 123456) and an optional locale parameter. The response includes a name string, a price object reflecting the regional pricing, and a stock object indicating availability. Running the same product_code against different locales lets you compare pricing and stock status across the UK, Irish, German, and Dutch storefronts for the same item.
Regional Coverage
Both endpoints support the same four locales: uk, ie, de, and nl. Locale selection affects both the currency and stock data returned — the UK and Ireland return GBP and EUR pricing respectively, while Germany and the Netherlands return Euro-denominated results. If no locale is specified, the endpoint falls back to a default region.
The Smyths Toys API is a managed, monitored endpoint for smythstoys.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when smythstoys.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 smythstoys.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?+
- Track price differences for the same toy SKU across UK, Irish, German, and Dutch storefronts using
get_product_detailswith different locale values. - Monitor stock availability for specific product codes ahead of peak shopping seasons like Christmas.
- Build a toy search interface that surfaces Smyths Toys results by keyword and locale for a regional audience.
- Alert users when a previously out-of-stock product (from the
stockobject) becomes available in their preferred locale. - Aggregate and compare product names and prices across European markets for competitive pricing analysis.
- Feed a product catalog database by paginating through
search_productsresults using thepageandpage_sizeparameters. - Validate that a list of product codes from internal systems returns valid entries on Smyths Toys across all supported regions.
| 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 Smyths Toys have an official developer API?+
What does the `get_product_details` endpoint return beyond price?+
price object (regional pricing), the response includes a name string and a stock object indicating availability for the given locale. The level of detail in the price and stock objects — such as sale prices, click-and-collect availability, or store-level stock — depends on what the product record exposes.Does the API cover customer reviews or product ratings for Smyths Toys items?+
get_product_details, and keyword-based product search via search_products. Reviews and ratings are not part of the current response shape. You can fork this API on Parse and revise it to add an endpoint targeting review data for a specific product.Are there any limitations on which locales are supported?+
uk (United Kingdom), ie (Ireland), de (Germany), and nl (Netherlands). Other countries where Smyths Toys operates — such as Austria or Switzerland — are not currently included. You can fork this API on Parse and revise it to add support for additional locale values if Smyths Toys expands their storefront coverage.How does pagination work in `search_products`?+
search_products endpoint accepts integer page and page_size parameters. Increment page while keeping page_size consistent to walk through result sets. If neither parameter is supplied, the endpoint returns a default page of results.