Systembolaget APIsystembolaget.se ↗
Search and retrieve wine, beer, spirits, and cider from Systembolaget's full catalog. Returns price, vintage, taste profiles, grapes, country, and more.
What is the Systembolaget API?
The Systembolaget API provides 2 endpoints to search and retrieve product data from Sweden's state-owned alcohol retailer. Use search_products to query the full catalog by text, category, country, and price range, then call get_product_details with the returned product_number to fetch granular fields including vintage year, grape varieties, taste description, serving suggestion, and volume in milliliters.
curl -X GET 'https://api.parse.bot/scraper/69d3b8ae-0e82-416f-8ff4-c6c2c7db7f34/search_products?page=1&query=barolo&sort_by=Score&category=Vin&page_size=5&sort_direction=Ascending' \ -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 systembolaget-se-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.
from parse_apis.systembolaget_product_api import Systembolaget, Product, Category, Sort, SortDirection
client = Systembolaget()
# Search for Italian wines sorted by price
for product in client.products.search(query="barolo", category=Category.VIN, sort_by=Sort.PRICE, sort_direction=SortDirection.ASCENDING, limit=5):
print(product.name, product.name_thin, product.price, product.country)
print(product.taste_clocks.body, product.taste_clocks.fruitacid)
# Fetch full details for a specific product
detail = client.products.get(product_number="7735001")
print(detail.name, detail.vintage, detail.producer, detail.alcohol_percentage)
print(detail.taste, detail.grapes, detail.taste_symbols)
Full-text search across Systembolaget's product catalog with filters for category, country, and price range. Returns paginated results sorted by relevance (Score) by default. Each product includes pricing, origin, taste profile, and stock status. Omitting all filters returns the full catalog. Pagination via page number; up to 30 results per page.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (1-based) |
| query | string | Text search query matching product names, producers, and regions (e.g. 'barolo', 'riesling', 'IPA') |
| country | string | Country of origin filter (e.g. 'Italien', 'Frankrike', 'Sverige', 'Storbritannien') |
| sort_by | string | Field to sort results by |
| category | string | Top-level beverage category filter |
| max_price | string | Maximum price in SEK |
| min_price | string | Minimum price in SEK |
| page_size | integer | Results per page, maximum 30 |
| sort_direction | string | Sort order direction |
{
"type": "object",
"fields": {
"page": "integer current page number",
"products": "array of Product objects",
"next_page": "integer or null, next page number",
"page_size": "integer results per page",
"total_pages": "integer total number of pages",
"total_results": "integer total number of matching products"
},
"sample": {
"data": {
"page": 1,
"products": [
{
"name": "Barolo",
"seal": "Naturkork",
"color": null,
"price": 2569,
"taste": null,
"usage": null,
"grapes": [],
"volume": 750,
"country": "Italien",
"vintage": "2020",
"producer": "Cantina Bartolo Mascarello",
"supplier": "Johan Lidby Vinhandel AB",
"image_url": "https://product-cdn.systembolaget.se/productimages/55622053/55622053",
"is_kosher": false,
"name_thin": "Bartolo Mascarello",
"packaging": "Glasflaska",
"assortment": "Tillfälligt sortiment",
"is_ethical": false,
"is_organic": false,
"product_id": "55622053",
"volume_text": "750 ml",
"taste_clocks": {
"body": 0,
"casque": 0,
"fruitacid": 0,
"roughness": 0,
"smokiness": 0,
"sweetness": 0,
"bitterness": 0
},
"beverage_type": "Vin",
"origin_level1": "Piemonte",
"origin_level2": "Barolo",
"taste_symbols": [],
"beverage_style": null,
"product_number": "9586901",
"custom_category": "Rött vin",
"is_out_of_stock": true,
"beverage_subtype": "Rött vin",
"alcohol_percentage": 14,
"sugar_content_gram_per_100ml": 0
}
],
"next_page": 2,
"page_size": 5,
"total_pages": 106,
"total_results": 530
},
"status": "success"
}
}About the Systembolaget API
Search the Catalog
The search_products endpoint accepts a free-text query (e.g., 'barolo', 'IPA', 'riesling') alongside optional filters: category (one of Vin, Öl, Sprit, Cider & blanddrycker, Alkoholfritt), country (e.g., 'Italien', 'Frankrike', 'Sverige'), min_price and max_price in SEK, and a sort_by field accepting Score, Price, Name, or Volume. Results are paginated — up to 30 per page — and each product object includes product_id, product_number, name, name_thin, beverage_type, beverage_subtype, and beverage_style. The total_results and total_pages fields let you iterate through the full result set.
Product Details
Pass any product_number from search results to get_product_details for the full record. The response includes price (in SEK), volume (in ml), country, vintage (year string or null), color, grapes (array of variety names), taste, usage (serving suggestion), and a seal field for any certification designations. Fields like taste and usage reflect the official Swedish-language descriptions used on the retail site.
Coverage and Language
The catalog covers all actively listed products across Systembolaget's assortment categories, including their permanent range and special-order items. Country names and category values are in Swedish (e.g., 'Italien' not 'Italy'), which matters when constructing filter queries. Products without a vintage, grapes, or taste note return null for those fields — common for spirits, beers, and non-alcoholic items.
The Systembolaget API is a managed, monitored endpoint for systembolaget.se — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when systembolaget.se 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 systembolaget.se 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 wine finder app that filters by country and price range using
min_price,max_price, andcountryparams - Aggregate vintage data across a region by paginating
search_productswith a country filter and extractingvintagefrom detail calls - Create a grape-variety browser by fetching
grapesarrays fromget_product_detailsacross the Vin category - Track price changes over time by periodically calling
get_product_detailsand storing thepricefield perproduct_number - Build a taste-profile recommender using the
taste,color, andbeverage_stylefields returned in product details - Generate a catalog export of all Swedish beers by querying
Ölcategory withcountryset to'Sverige'and paginating results
| 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 Systembolaget provide an official public developer API?+
What does `search_products` return versus `get_product_details`?+
search_products returns a paginated list with summary fields: product_id, product_number, name, beverage_type, beverage_subtype, and beverage_style. It does not include taste, grapes, vintage, or price — those fields are only available by calling get_product_details with the product_number from the search result.Do country and category filter values need to be in Swedish?+
country parameter expects Swedish-language country names (e.g., 'Italien', 'Frankrike', 'Spanien'), and the category values are also Swedish (e.g., 'Vin', 'Öl', 'Sprit'). Passing English equivalents will return no results.Does the API include store stock levels or availability by location?+
Is there a way to retrieve user reviews or ratings for products?+
taste, usage, grapes, and color, but no user-generated reviews or aggregate ratings are returned. You can fork this API on Parse and revise it to add a reviews or ratings endpoint if that data is accessible on the source.