Jula APIjula.fi ↗
Access Jula.fi product catalog data via API. Search products, browse categories, and fetch detailed SKUs, VAT pricing, brand info, stock status, and review scores.
What is the Jula API?
The Jula.fi API provides 3 endpoints to query the Finnish hardware store's product catalog, returning fields like SKU, brand, price including and excluding VAT, stock status, and review aggregates. Use search_products to run full-text queries across the catalog, get_category_products to retrieve all items under a specific category path, or get_product_details to pull complete information on a single product including description and review score.
curl -X GET 'https://api.parse.bot/scraper/80116cba-47d0-4afb-a62e-b72797e05ead/search_products?query=hammer&offset=0&page_size=48' \ -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 jula-fi-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.
"""
Jula Finland Product API - Search and browse Finnish hardware store products.
"""
from parse_apis.jula_finland_product_api import Jula, Product, ProductDetail, Category
client = Jula()
# Search for products by keyword with automatic pagination
for product in client.products.search(query="hammer", limit=5):
print(product.title, product.sku, product.price_inc_vat, product.brand)
# Get detailed info for a specific product
detail = client.productdetails.get(product_path="tyokalut-ja-koneet/kasityokalut/ruuvitaltat/uraruuvitaltat/uraruuvimeisseli-030458")
print(detail.title, detail.brand, detail.price_inc_vat, detail.description)
# Browse a category
category = client.categories.get(category_path="tyokalut-ja-koneet/kasityokalut/ruuvitaltat")
print(category.total, category.category_path)
for item in category.products:
print(item.title, item.sku, item.price_exc_vat, item.in_web_stock)
Full-text search across Jula.fi product catalog. Returns paginated results with SKU, pricing, brand, stock status, and review data. Pagination via offset; each page returns up to page_size items. An empty query is rejected.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Search keyword (e.g. 'hammer', 'drill', 'ruuvimeisseli') |
| offset | integer | Pagination offset (number of products to skip). Starts at 0. |
| page_size | integer | Number of products per page (max items returned per call). |
{
"type": "object",
"fields": {
"query": "string - the search term used",
"total": "integer - total matching products",
"offset": "integer - current offset",
"products": "array of product objects with sku, product_id, title, url, brand, price_inc_vat, price_exc_vat, price_type, is_sellable, in_web_stock, category, parent_category, review_score, review_count",
"page_size": "integer - page size used",
"has_next_page": "boolean - whether more results exist",
"next_page_offset": "integer - offset for next page"
},
"sample": {
"data": {
"query": "hammer",
"total": 7,
"offset": 0,
"products": [
{
"sku": "R023446",
"url": "/catalog/varaosat/sahkotyokalut-ja-koneet/sahkokomponentit/virtakytkimet/virtakytkimet-breaker-hammer-r023446/",
"brand": "",
"title": "Virtakytkimet Breaker Hammer",
"category": "Virtakytkimet",
"price_type": "Base",
"product_id": "01041254",
"is_sellable": true,
"in_web_stock": true,
"review_count": 0,
"review_score": 0,
"price_exc_vat": 11.87,
"price_inc_vat": 14.9,
"parent_category": "Sähkökomponentit"
}
],
"page_size": 48,
"has_next_page": false,
"next_page_offset": 7
},
"status": "success"
}
}About the Jula API
Endpoints and Data Coverage
The API covers three operations against the Jula.fi catalog. search_products accepts a required query string plus optional offset and page_size parameters for pagination. Each result object includes sku, product_id, title, url, brand, price_inc_vat, price_exc_vat, price_type, is_sellable, and in_web_st (web stock indicator). The response also returns total, has_next_page, and next_page_offset so you can walk through all matching results systematically. An empty query string is rejected.
Category Browsing
get_category_products takes a category_path corresponding to the URL segments after /catalog/ on jula.fi — for example, tyokalut-ja-koneet/kasityokalut/ruuvitaltat. It returns the same per-product fields as search results alongside the total count for that category. This makes it straightforward to enumerate every product under a specific department or sub-category without constructing search queries.
Product Detail
get_product_details resolves a single product by its full catalog path and returns the most complete record: sku, brand, title, description, price_exc_vat, price_inc_vat, price_type (e.g. Base or Campaign to identify sale pricing), review_count, and review_score out of 5. Review fields return null when no reviews exist for that product. This endpoint is the only one that exposes the description field and review aggregates.
The Jula API is a managed, monitored endpoint for jula.fi — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when jula.fi 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 jula.fi 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 changes (inc/exc VAT) across Jula.fi tool categories for competitive analysis.
- Check
is_sellableandin_web_stfields to track which products are currently available for online purchase. - Identify campaign-priced products by filtering on
price_typeequal to 'Campaign' via search results. - Aggregate review scores across a category using
get_category_productscombined withget_product_detailscalls. - Build a product feed for a Finnish hardware price comparison site using paginated
search_productsresults. - Sync a specific department's full product list into an internal database using
get_category_productswith nested category paths. - Look up SKU and brand data for specific products to cross-reference with supplier catalogs.
| 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 Jula.fi have an official public developer API?+
How does `get_product_details` differ from the product objects returned by search or category endpoints?+
get_product_details is the only endpoint that returns description text and review aggregates (review_count and review_score). The search and category endpoints return the same core fields — SKU, pricing, brand, is_sellable, and in_web_st — but omit description and review data. If those fields matter, a secondary call to get_product_details per product is required.Does the API cover store-level stock availability, such as inventory per physical Jula location?+
in_web_st, which reflects web stock status, and is_sellable. Per-store inventory levels across individual Jula locations are not exposed. You can fork this API on Parse and revise it to add a store-stock endpoint if that data is accessible on the site.What does `price_type` indicate in the response?+
price_type signals the pricing context for a product. A value of Base means the standard list price; Campaign indicates the product is on a promotional or sale price. Both price_inc_vat and price_exc_vat reflect whichever price type is currently active.Is individual review text or reviewer details available through the API?+
review_count and review_score (an average out of 5) from get_product_details, but individual review bodies, reviewer names, or review dates are not returned. You can fork this API on Parse and revise it to add a review-listing endpoint for per-review content.