Power APIpower.no ↗
Search power.no products, browse the category tree, fetch price history, and list campaign deals and outlet units. All prices in NOK.
What is the Power API?
The power.no API provides 5 endpoints covering the full Norwegian consumer electronics catalogue: search and filter products with real-time NOK pricing, retrieve individual product pages with price history and specifications, walk the complete category tree, page through active campaign (sale) collections, and list individual outlet units with condition and store data. The get_product endpoint alone returns over a dozen fields including price_history, description_html, specifications, and variant_product_ids.
curl -X GET 'https://api.parse.bot/scraper/373e9f4c-c230-4655-b9b3-8514c8089567/search_products?query=iphone' \ -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 power-no-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.
"""Walkthrough: Power Norway SDK — search, detail drill-down, campaign browse."""
from parse_apis.power_no_api import PowerNo, SortOrder, StockFilter, ProductNotFound
client = PowerNo()
# Search for TVs sorted by price, cap at 5 results.
for tv in client.product_summaries.search(query="TV", sort=SortOrder.PRICE_ASC, limit=5):
print(tv.title, tv.price, "NOK", "ON SALE" if tv.is_on_sale else "")
# Drill into the first search hit for full product details.
summary = client.product_summaries.search(query="Samsung TV", limit=1).first()
if summary is not None:
product = summary.details()
print(product.title, product.price, "NOK")
print("Images:", len(product.images))
for spec in product.specifications[:3]:
print(f" {spec.group} / {spec.name}: {', '.join(spec.values)}")
for pt in product.price_history[:3]:
print(f" {pt.timestamp}: {pt.price} NOK")
# Browse the first campaign badge found on this product.
if product.campaigns:
camp = product.campaigns[0]
campaign = client.campaign(campaign_id=camp.campaign_id)
for deal in campaign.products.list(sort=SortOrder.PRICE_ASC, limit=3):
print(deal.title, deal.price, "NOK", f"save {deal.savings}" if deal.savings else "")
# Point lookup by a known product id; handle not-found gracefully.
try:
detail = client.products.get(product_id=product.product_id) if summary else None
if detail:
print(detail.title, detail.web_stock_count, "web stock")
except ProductNotFound:
print("Product not found")
# Browse outlet deals in a category derived from an earlier product.
if summary is not None:
for outlet in client.outlet_products.list(category_id=product.category_id, limit=3):
print(outlet.title, outlet.price, "NOK", outlet.outlet_store, outlet.outlet_reason)
print("exercised: product_summaries.search / details / products.get / campaign.products.list / outlet_products.list")
Searches or browses the power.no catalogue. Returns one page of product summaries (one row per product/variant) with current price, previous price and computed savings when the product is on sale, stock counts, campaign badges and the available facet filters (brands, stock states, price range, category counts) for the current result set. At least one of query or category_id should be given; with neither the call returns the popularity-sorted catalogue. Pagination is offset based: page (1-based) and page_size (1-100, default 36) select the slice, total_count is the site's total for the query and has_more says whether a further page exists. Filters brand, stock and min_price/max_price are applied by the site. An unknown search term yields an empty products array with total_count 0.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| sort | string | Result ordering. Omitted = relevance when query is given, otherwise popularity. |
| brand | string | Exact brand name as shown in the search filters (filters[attribute_id=BasicBrand].values[*].value), e.g. Samsung. |
| query | string | Free-text search term, e.g. a product name or brand. |
| stock | string | Stock-state filter. Omitted = no stock filter. |
| max_price | integer | Maximum price in NOK (inclusive). |
| min_price | integer | Minimum price in NOK (inclusive). |
| page_size | integer | Products per page; values above 100 are clamped to 100. |
| category_id | integer | Restrict to one category: category_id from list_categories.categories[*].category_id (also nested children[*].category_id). |
{
"type": "object",
"fields": {
"page": "integer, echoed 1-based page",
"sort": "string, effective sort key",
"filters": "array of facet filters for the result set: attribute_id, name, values[] of {value, count}; the price facet carries min and max instead",
"has_more": "boolean, whether a further page exists",
"products": "array of product summaries: product_id, title, brand, brand_id, category_id, category_name, model_number, price (NOK incl. VAT), price_ex_vat, previous_price (null when not discounted), is_on_sale, savings (previous_price - price, null when no previous price), previous_price_disclaimer, short_description, sales_arguments (array of bullet strings), energy_class, rating, review_count, web_stock_count, store_stock_count, web_stock_status (site status key), stock_delivery_date, can_add_to_cart, url, image_url, campaigns (array of campaign badges with campaign_id, name, slug, badge_text, active_from, active_to)",
"page_size": "integer, effective page size after clamping",
"total_count": "integer, site total for the query before paging"
},
"sample": {
"data": {
"page": 1,
"sort": "relevance",
"filters": [
{
"name": "Merke",
"values": [
{
"count": 425,
"value": "Apple"
}
],
"attribute_id": "BasicBrand"
}
],
"has_more": true,
"products": [
{
"url": "https://www.power.no/mobil-og-foto/mobiltelefon/apple-iphone-18-pro-256-gb-burgunder/p-4532293/",
"brand": "Apple",
"price": 15990,
"title": "Apple iPhone 18 Pro 256 GB, burgunder",
"rating": null,
"savings": null,
"brand_id": 610,
"campaigns": [
{
"name": "1500produkter",
"slug": "1500produkter",
"active_to": "2027-02-28T00:00:00+01:00",
"badge_text": null,
"active_from": "2026-02-09T00:00:00+01:00",
"campaign_id": 32917
}
],
"image_url": "https://media.power-cdn.net/images/h-2f15b8fbbc4ad3319e9c0cc2c02047c3/products/4532293/4532293_2_1200x1200_w_g.jpg",
"is_on_sale": false,
"product_id": 4532293,
"category_id": 2015,
"energy_class": "A",
"model_number": "MJRR4QN/A",
"price_ex_vat": 12792,
"review_count": null,
"category_name": "Mobiltelefon",
"previous_price": null,
"can_add_to_cart": true,
"sales_arguments": [
"6,3\" Super Retina XDR OLED skjerm",
"Hovedkameraer: 48+48+48 MP"
],
"web_stock_count": 0,
"web_stock_status": "Product.Stock.ComingInUnconfirmed",
"short_description": "Den ultimate Pro.",
"store_stock_count": 1,
"stock_delivery_date": "2026-09-26T00:00:00",
"previous_price_disclaimer": null
}
],
"page_size": 5,
"total_count": 6530
},
"status": "success"
}
}About the Power API
Product Search and Browsing
The search_products endpoint accepts a free-text query, price bounds (min_price / max_price in NOK), a brand filter, a stock state filter, and pagination controls (page, page_size, clamped to 100). It returns a products array of summaries — each row includes product_id, title, brand, price, previous_price, savings, is_on_sale, category_id, category_name, model_number, and campaigns badges. The filters array in the response exposes available facets (brands, stock states, price range min/max) that can be fed back as inputs to narrow results. total_count and has_more support full pagination.
Category Tree, Campaigns, and Outlet
list_categories returns the complete power.no category tree in a single call. Every node carries category_id (usable in search_products), menu_node_id, name, url, and a recursive children array. list_campaign_products takes the same filter parameters as search_products and pages through products belonging to a named sale event; previous_price and savings are populated for all discounted items. list_outlet_products exposes individual discounted units — demo items, returns, and open-box stock — with outlet-specific fields: outlet_id, outlet_reason, outlet_store, and outlet_url. The same product_id can appear multiple times in outlet results when several units of the same product exist across different stores.
Full Product Detail
get_product requires a product_id (sourced from any listing endpoint) and returns the complete product record: description_html, barcode, images (array of URLs), specifications (grouped rows of attribute_id, group, name, values, unit), cheapest_freight_price, variant_attributes (sibling variants with their own product_ids), and a price_history array of {price, timestamp} records showing past price changes. This makes it straightforward to track discounting patterns over time for any SKU.
Coverage Notes
All prices are in NOK inclusive of VAT, matching what is displayed on the Norwegian power.no storefront. The search_products and listing endpoints share a consistent response shape, so the same parsing logic applies across search, campaign, and outlet contexts. Page size is capped at 100 per call; use page and has_more to iterate through larger result sets.
The Power API is a managed, monitored endpoint for power.no — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when power.no 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 power.no 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 drops on specific SKUs using
price_historyfromget_product. - Build a Norwegian electronics price comparison tool using
search_productswithmin_price/max_pricefilters. - Alert users to active sale events by paging through
list_campaign_productsand surfacingsavingsandprevious_price. - Aggregate outlet deals by condition type using
outlet_reasonandoutlet_storefromlist_outlet_products. - Populate a category navigation menu using the full tree returned by
list_categories. - Monitor brand-specific inventory by filtering
search_productsonbrandandstockstate. - Extract structured product specifications from
specificationsinget_productfor data enrichment pipelines.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does power.no have an official developer API?+
What does `list_outlet_products` return that regular search does not?+
search_products results: outlet_id (the specific unit identifier), outlet_reason (condition description, e.g. demo or return), outlet_store (the physical store holding the unit), and outlet_url (direct link to the outlet listing). Because one product can have multiple outlet units across stores, the same product_id may appear several times in the response.How far back does the price history go for a product?+
price_history array in get_product returns all price change records available from the source. There is no documented fixed lookback window, so depth varies by product. The records are timestamped ({price, timestamp}), allowing you to calculate how long any price has been in effect.Does the API cover user reviews or ratings for products?+
Can I retrieve products by category without a text search?+
list_categories returns every category node with its category_id. That category_id can be passed to search_products to browse category contents without a free-text query. Combine with sort, brand, and price range inputs to filter results within the category.