{
    "schema_version": 4,
    "name": "Marktanalyse: Schweiz, November 2026",
    "country": "ch",
    "country_name": "Schweiz",
    "lang": "de",
    "month": "2026-11",
    "period": {
        "from": "2026-11-01",
        "to": "2026-11-30"
    },
    "currency": "CHF",
    "min_samples": 5,
    "min_model_samples": 3,
    "min_service_unit_samples": 3,
    "schema_changes": {
        "2": "H-023: model level added (fields level, model, brand, model_key, model_samples, model_shops, used, product_id; the models list of each category row; models_count, other_samples, models_note). The version 1 fields keep their names and meaning; a category row reads as before.",
        "3": "H-026: goods and services (fields kind, unit_code, variant, unit_samples, unit_shops; the units list of each category row with level \"unit\" rows; units_count, units_note, unit_label). Goods keep their models; a service has no models (models empty, models_note null) and is grouped by price unit instead, from 3 prices a unit, its category row being its most usual unit. The version 1 and 2 fields keep their names and meaning; ?level=category in the CSV gives the same category lines as before.",
        "4": "H-084: the price index is now the market analysis (the same addresses). New top-level field sellers: one entry a category with firms in our data (category_id, category_slug, category_name, category_url, has_prices, sellers_count, sellers: up to 10 of {name, city, url}); the registered sellers first, the rest alphabetical, not a rating; only public company data. With ?category= the entry of that category only. All earlier fields keep their names and meaning."
    },
    "updated_at": "2026-11-05T23:43:21Z",
    "generated_at": "2026-11-05T23:44:05Z",
    "refresh_hours": 6,
    "html": "https://blablaprice.com/ch/site/price-index/custom-made-furniture",
    "csv": "https://blablaprice.com/ch/site/price-index.csv?category=custom-made-furniture",
    "license": "https://creativecommons.org/licenses/by/4.0/",
    "creator": "BlaBlaPrice (EVERLOGIC LLC)",
    "months_available": [
        "2026-11"
    ],
    "fields": [
        "country",
        "lang",
        "month",
        "category_slug",
        "category_name",
        "p25",
        "median",
        "p75",
        "currency",
        "samples",
        "updated_at",
        "unit",
        "shops",
        "requests",
        "level",
        "model",
        "brand",
        "model_key",
        "model_samples",
        "model_shops",
        "used",
        "product_id",
        "kind",
        "unit_code",
        "variant",
        "unit_samples",
        "unit_shops"
    ],
    "field_docs": {
        "country": "country code of the site folder (ISO 3166-1 alpha-2, lower case; \"ua\" = Ukraine, \"us\" = the site root)",
        "lang": "language of category_name (ISO 639-1)",
        "month": "calendar month of the observations, YYYY-MM",
        "category_slug": "address of the category page on this country's site, relative to the country folder",
        "category_name": "category name in lang",
        "p25": "25th percentile of the observed prices (a quarter of the prices are lower), in currency, rounded to 2 significant digits",
        "median": "median (50th percentile) of the observed prices, in currency, rounded to 2 significant digits",
        "p75": "75th percentile of the observed prices (three quarters are lower), in currency, rounded to 2 significant digits",
        "currency": "ISO 4217 code; prices in other currencies are not converted, they are left out",
        "samples": "number of distinct prices behind the row (a goods category at least 5, a service unit at least 3)",
        "updated_at": "time of the newest price in the row, ISO 8601, UTC",
        "unit": "on a category row: price unit when sellers quote per unit (per hour, per m2), as the source wrote it, empty = a whole item or job; on a unit row (level \"unit\"): the unit code, the same as unit_code",
        "shops": "number of distinct sellers (web sites or BlaBlaPrice accounts) behind the row",
        "requests": "number of distinct buyer requests whose web search or offers gave the prices; a small number means the row rests on few searches",
        "level": "\"category\" for a row of all the category's prices, \"model\" for the prices of one model inside a goods category (schema_version 2), \"unit\" for the prices of one unit inside a service category (schema_version 3); in JSON the model rows are in the category row's \"models\" list and the unit rows in its \"units\" list, in CSV they follow their category row",
        "model": "model without the brand, as most shops write it, taken from the shop's product title: series and code, plus the memory or capacity when the title gives it (\"iPhone 14 Pro 256GB\", \"TDLRB 65242BS\"); empty on a category row",
        "brand": "brand named in the title, or the only brand that makes the product line in it (iPhone: Apple, Galaxy: Samsung, Redmi and Poco: Xiaomi); empty on a category row",
        "model_key": "stable key of the model: Latin letters, digits and hyphens, brand first, \"-used\" at the end for used or refurbished goods (\"apple-iphone-14-pro-256gb-used\"); empty on a category row",
        "model_samples": "number of distinct prices of the model (at least 3); equals samples on a model row, empty on a category row",
        "model_shops": "number of distinct sellers of the model; equals shops on a model row, empty on a category row",
        "used": "true when the shops' titles say used or refurbished (б/у, б/в, вживаний, refurbished, \"хороший стан\"); such goods are a model of their own; false = not said to be used; empty on a category row",
        "product_id": "ID of the matching product card of the BlaBlaPrice catalog when the brand and the model match one, else empty (cards are not created from shop titles)",
        "models": "JSON only: the category's model rows, more prices first; empty when no model has 3 prices",
        "models_count": "JSON only: number of models shown for the category",
        "other_samples": "JSON only: prices of the category not in a shown model (no clear model in the title, or fewer than 3 prices of that model); they are in the category row, not in a model",
        "models_note": "JSON only: why the category has no model rows yet, in lang; null when it has some",
        "name": "JSON model rows only: brand and model as the page shows them",
        "label": "JSON model and unit rows: the model with the used mark, or the service with its unit (\"Maths tutors: prices per hour\"), in lang",
        "kind": "\"goods\" or \"service\" (schema_version 3). Goods are grouped by model, services by price unit: a service has no models. Worked out once per country, not per page: the kind the request reader gave the category's requests (two thirds agreeing), else per-hour prices, else the category's name, else its section of the tree",
        "unit_code": "service rows: the unit of the price, a stable code: hour, lesson, visit, m2, m3, lm (running metre), kg, pack, t, l, or service = the source names no unit (a price for the whole service). Taken from the price's own unit or a unit the seller's title states outright (\"1 lesson\", \"per hour\"), never guessed; on a service category row the code of its first unit; empty for goods",
        "variant": "service rows: the variant every price of the unit names in its title: group, individual, online, or several joined with \"+\"; empty when the titles name none or differ (then see variants)",
        "unit_samples": "service rows: number of distinct prices of the unit (at least 3); on a category row those of its first unit; empty for goods",
        "unit_shops": "service rows: number of distinct sellers of the unit; empty for goods",
        "units": "JSON only: a service category's unit rows, more prices first, never mixed; empty for goods",
        "units_count": "JSON only: number of units shown for the category",
        "units_note": "JSON only: why a service category has no unit row yet, in lang; null otherwise",
        "unit_label": "JSON service rows only: the unit as the page says it, in lang (\"за годину\", \"per lesson\")",
        "variants": "JSON unit rows only: how many prices of the unit name each variant in their titles",
        "variant_label": "JSON unit rows only: the variant in lang"
    },
    "methodology": {
        "source": {
            "term": "Quelle",
            "text": "Preise auf Websites von Shops und Anbietern, die die Websuche von BlaBlaPrice für Anfragen von Käufern in der Schweiz gefunden hat, dazu Preise aus Angeboten von Anbietern auf BlaBlaPrice und aus Preislisten, die Anbieter hochgeladen haben. Testkonten zählen nicht. Einmal im Monat sammelt BlaBlaPrice außerdem die Preise der Onlineshops des Landes."
        },
        "period": {
            "term": "Zeitraum",
            "text": "Ein Kalendermonat: November 2026. Ein Preis gehört zu dem Monat, in dem die Suche ihn gefunden oder der Anbieter ihn geschickt hat. Frühere Monate sind unten verlinkt, wenn es Daten gibt."
        },
        "filter": {
            "term": "Auswahl",
            "text": "Nur Preise in CHF. Suchergebnisse, die nicht zur Anfrage passen (Übereinstimmung unter 50 von 100 oder als «passt nicht» markiert), fallen weg. Derselbe Preis auf derselben Seite zählt einmal. Hat eine Kategorie Preise in verschiedenen Einheiten, bleibt die häufigste (zum Beispiel pro Stunde), damit ein Stundensatz nicht mit dem Preis eines ganzen Auftrags vermischt wird."
        },
        "min": {
            "term": "Minimum",
            "text": "Eine Kategorie kommt in die Tabelle, wenn sie im Monat mindestens 5 Preise hat. Mit weniger wird sie nicht gezeigt, weil eine Spanne aus wenigen Preisen zufällig ist. Darum ändert sich die Liste der Kategorien von Monat zu Monat."
        },
        "kind": {
            "term": "Waren und Dienstleistungen",
            "text": "Waren gruppieren wir nach Modell, weil das Modell den Preis bestimmt: Zwei Waschmaschinen verschiedener Modelle kosten selbst in einer Kategorie unterschiedlich viel. Dienstleistungen gruppieren wir nach Mengeneinheit, weil eine Dienstleistung kein Modell hat und ihr Preis vom Umfang der Arbeit abhängt: eine Stunde, eine Unterrichtseinheit, ein Quadratmeter, eine Anfahrt. Die Einheit stammt aus dem Preis selbst oder aus dem Titel auf der Website des Anbieters („pro Stunde“, „1 Einheit“); nennt keiner eine, ist es ein Preis für die ganze Leistung, und wir erfinden keine Einheit. Preise in verschiedenen Einheiten mischen wir nicht: Eine Nachhilfestunde und ein ganzer Kurs, eine Anfahrtspauschale und der ganze Auftrag unterscheiden sich um ein Mehrfaches, ein gemeinsamer Median beschriebe keinen davon. Eine Einheit braucht 3 Preise, um in die Tabelle zu kommen. Ob eine Kategorie Waren oder Dienstleistungen enthält, bestimmen wir einmal pro Land: danach, wie BlaBlaPrice die Anfragen der Käufer darin erkannt hat, nach Stundenpreisen, nach dem Namen der Kategorie und nach ihrem Bereich im Katalog."
        },
        "model": {
            "term": "Modelle",
            "text": "Das Modell stammt aus dem Produktnamen auf der Website des Shops. Der Name muss die Marke nennen (oder eine Produktlinie, die nur eine Marke herstellt: iPhone und iPad von Apple, Galaxy von Samsung, Redmi und Poco von Xiaomi); das Modell sind Name und Code direkt nach der Marke. Farbe, Jahr, Bildschirmgrösse, «Original», «Neu», Emoji, Regionskennzeichen (UA, EU, Global) und Einheiten fallen weg; Speicher (128GB, 8/256GB) und Reifengrösse bleiben, weil der Preis davon abhängt. Gebrauchte und generalüberholte Ware (gebraucht, refurbished) ist ein eigenes Modell. Ein Modell erscheint, sobald es 3 Preise oder mehr hat: Der Median aus ein oder zwei Preisen ist Zufall, bei drei sieht man schon, wo der Preis liegt. Passt ein Modell zu einer Karte im Katalog von BlaBlaPrice, enthält das JSON ihre product_id; aus Shopnamen werden keine Karten angelegt."
        },
        "others": {
            "term": "Übrige",
            "text": "Ein Preis kommt zu «Übrige», wenn der Name kein eindeutiges Modell nennt: keine bekannte Marke («Waschmaschinen für 5 kg»), kein Modellcode («Tigar Winter»), nur eine Grösse («Xiaomi 32»), kein Speicher, obwohl andere Shops ihn beim selben Modell angeben («iPhone 14 Pro» neben «iPhone 14 Pro 256GB»), oder das Modell hat im Monat noch zu wenige Preise (3 Preise sind nötig). Diese Preise stehen in der Zeile der ganzen Kategorie, nicht bei den Modellen. Hat eine Kategorie kein solches Modell, zeigen wir nur ihre Spanne mit dem Hinweis «noch zu wenige Preise pro Modell»."
        },
        "pct": {
            "term": "Perzentile",
            "text": "25. Perzentil (untere Grenze): ein Viertel der gefundenen Preise liegt darunter. Median: die Hälfte liegt darunter, die Hälfte darüber. 75. Perzentil (obere Grenze): drei Viertel liegen darunter. Zwischen den Grenzen liegt die mittlere Hälfte der Preise, deshalb verschiebt ein einzelnes sehr billiges oder sehr teures Angebot die Spanne nicht. Zwischen benachbarten Preisen wird linear interpoliert."
        },
        "round": {
            "term": "Rundung",
            "text": "Die Werte sind auf zwei signifikante Stellen gerundet (13 009 wird zu 13 000), weil es eine Marktspanne ist und nicht der Preis eines bestimmten Produkts."
        },
        "cur": {
            "term": "Währung",
            "text": "CHF. Preise in anderen Währungen werden weder umgerechnet noch gezählt."
        },
        "upd": {
            "term": "Aktualisierung",
            "text": "Die Tabelle wird alle 6 Stunden neu berechnet. Neuester Preis darin: 5. November 2026. Berechnet am 5. November 2026."
        },
        "limits": {
            "term": "Grenzen",
            "text": "Das sind nicht alle Anbieter des Landes, nur jene, die die Suche für Anfragen auf BlaBlaPrice gefunden hat; die Kategorien spiegeln also, was Käufer gesucht haben. Die Preise sind so, wie die Website des Anbieters sie zeigte: Lieferung, Montage, persönliche Rabatte und Verhandeln sind meist nicht enthalten. Eine Kategorie mischt verschiedene Modelle und Auftragsgrössen. Eine Zeile kann auf einer oder zwei Anfragen beruhen (Feld requests im JSON und CSV). Der Index ist kein Angebot von BlaBlaPrice: Wir verkaufen selbst keine Produkte oder Dienstleistungen."
        }
    },
    "count": 1,
    "models_count": 0,
    "units_count": 0,
    "kinds": {
        "goods": 1,
        "service": 0
    },
    "note": null,
    "rows": [
        {
            "country": "ch",
            "lang": "de",
            "month": "2026-11",
            "category_slug": "custom-made-furniture",
            "category_name": "Massgefertigte Möbel",
            "p25": 16,
            "median": 110,
            "p75": 220,
            "currency": "CHF",
            "samples": 10,
            "updated_at": "2026-11-05T23:42:11Z",
            "unit": "",
            "shops": 10,
            "requests": 0,
            "level": "category",
            "model": null,
            "brand": null,
            "model_key": null,
            "model_samples": null,
            "model_shops": null,
            "used": null,
            "product_id": null,
            "kind": "goods",
            "unit_code": null,
            "variant": null,
            "unit_samples": null,
            "unit_shops": null,
            "category_id": 692,
            "category_url": "https://blablaprice.com/ch/custom-made-furniture",
            "models": [],
            "models_count": 0,
            "units": [],
            "units_count": 0,
            "other_samples": 10,
            "models_note": "Noch zu wenige Preise pro Modell: Ein Modell braucht 3 Preise, keines hat sie bisher erreicht. Darunter die Spanne der ganzen Kategorie.",
            "units_note": null
        }
    ],
    "field_docs_sellers": {
        "name": "the firm's name (its own, or its site's name)",
        "city": "its town when known, else null",
        "url": "its own site (the home page), null for a seller registered on BlaBlaPrice without a confirmed site"
    },
    "sellers_categories": 1,
    "sellers": [
        {
            "category_id": 692,
            "category_slug": "custom-made-furniture",
            "category_name": "Massgefertigte Möbel",
            "category_url": "https://blablaprice.com/ch/custom-made-furniture",
            "has_prices": true,
            "sellers_count": 10,
            "sellers": [
                {
                    "name": "bader",
                    "city": null,
                    "url": "https://bader.ch/"
                },
                {
                    "name": "btto",
                    "city": null,
                    "url": "https://btto.com/"
                },
                {
                    "name": "esstische",
                    "city": null,
                    "url": "https://esstische.ch/"
                },
                {
                    "name": "martingabriel",
                    "city": null,
                    "url": "https://martingabriel.ch/"
                },
                {
                    "name": "meinlieblingsrahmen",
                    "city": null,
                    "url": "https://meinlieblingsrahmen.ch/"
                },
                {
                    "name": "spiegel21",
                    "city": null,
                    "url": "https://spiegel21.ch/"
                },
                {
                    "name": "storenonline",
                    "city": null,
                    "url": "https://storenonline.ch/"
                },
                {
                    "name": "traumglass",
                    "city": null,
                    "url": "https://traumglass.ch/"
                },
                {
                    "name": "vivalacasa",
                    "city": null,
                    "url": "https://vivalacasa.ch/"
                },
                {
                    "name": "wood-dream",
                    "city": null,
                    "url": "https://wood-dream.ch/"
                }
            ]
        }
    ],
    "category": "custom-made-furniture",
    "total_count": 0,
    "pagination": {
        "page": 1,
        "per_page": 50,
        "pages": 1,
        "total": 0,
        "of": "models",
        "prev": null,
        "next": null
    },
    "query_parameters": {
        "m": "YYYY-MM, an earlier month",
        "category": "category_slug: that category only, its models or units paged",
        "page": "page number from 1, 50 rows a page (categories, or the category's models or units)"
    }
}