{
  "catalogueVersion": "1.0.0",
  "generatedAt": "2026-10-26T03:38:40.384Z",
  "licence": {
    "name": "Creative Commons Attribution 4.0 International (CC BY 4.0)",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "attribution": "Cosmeds platform open data",
    "statement": "Free to reuse, republish and build on, including commercially, provided the dataset is credited and linked. Credit the source and link to the dataset page."
  },
  "page": "/open-data",
  "datasets": [
    {
      "id": "verification-coverage",
      "title": "Clinic verification coverage",
      "summary": "Published, verified and regulator-registered clinic listing counts for the whole directory, broken down by city and by regulator, with the last complete quarter's watchdog-story count.",
      "page": "/open-data",
      "schema": "/api/open-data/verification-coverage/schema.json",
      "updateCadence": "Recomputed on demand and cached for 10 minutes. Figures move whenever a listing is published, verified or credentialled.",
      "keywords": [
        "UK cosmetic clinics",
        "verification coverage",
        "regulator registration",
        "open data"
      ],
      "limitations": [
        "This counts listings on this directory, not clinics in the UK. A clinic that has never been listed here is absent, and its absence means nothing about that clinic.",
        "Verified means we checked the listing against our own verification process. Unverified does not mean unsafe — it means we have not verified it.",
        "Regulator-registered counts a listing whose parent business holds a current green regulator credential in our records. A clinic registered with a regulator but not yet credentialled here counts as not regulated in this dataset.",
        "The city breakdown is capped at the 50 cities with the most published listings, and the regulator breakdown at 20 regulators. Totals cover everything, including rows outside those caps, so the city rows will not sum to the totals.",
        "The regulator breakdown counts the regulator recorded against a listing at import time. It is a provenance field, not a live credential check — the credential check is the regulator transparency dataset.",
        "Watchdog stories are counted for the last COMPLETE calendar quarter. The current quarter is excluded because a quarter-to-date count always reads as a decline. Stories are geo-tagged by region, not by city.",
        "Percentages are null rather than 0% where there is nothing to divide. A null is missing data, not a zero.",
        "This is a live snapshot, not a time series. Figures move as listings are published, verified and credentialled; cite the snapshot timestamp, not the page."
      ],
      "distributions": [
        {
          "label": "Full dataset (JSON)",
          "href": "/api/open-data/verification-coverage.json",
          "format": "application/json",
          "note": "Totals, city and regulator tables, watchdog stories, derivations, limitations and licence."
        },
        {
          "label": "Schema (JSON)",
          "href": "/api/open-data/verification-coverage/schema.json",
          "format": "application/json",
          "note": "Column-by-column documentation of the shape."
        },
        {
          "label": "By city (CSV)",
          "href": "/api/open-data/verification-coverage/cities.csv",
          "format": "text/csv",
          "note": "One row per city, with regulator coverage."
        },
        {
          "label": "By regulator (CSV)",
          "href": "/api/open-data/verification-coverage/regulators.csv",
          "format": "text/csv",
          "note": "One row per regulator recorded against a listing."
        },
        {
          "label": "Watchdog stories (CSV)",
          "href": "/api/open-data/verification-coverage/watchdog-stories.csv",
          "format": "text/csv",
          "note": "One row per geography for the last complete quarter."
        }
      ],
      "publishedHere": true
    },
    {
      "id": "treatment-prices",
      "title": "Quoted treatment price bands",
      "summary": "Quartile price bands for cosmetic treatments, derived from real quotes UK clinics submitted through this site's request-a-quote service. Published nationally and per city, only where the sample clears the platform's disclosure floors.",
      "page": "/open-data",
      "schema": "/api/open-data/treatment-prices/schema.json",
      "updateCadence": "Recomputed nightly by the price aggregation job. Each snapshot is pinned to one computation day, published in every row.",
      "keywords": [
        "UK cosmetic treatment prices",
        "price quartiles",
        "quoted prices",
        "open data"
      ],
      "limitations": [
        "These are prices clinics quoted through this site's request-a-quote service. They are not prices anyone paid, and not a survey of published price lists.",
        "The sample is this platform's marketplace, not the UK market. A treatment or city with no rows here has too few quotes to publish, which says nothing about what it costs.",
        "A cell is published only where at least 5 distinct clinics contributed and the sample reached 8 usable quotes. Cells below either floor are withheld and counted, never rounded to zero.",
        "Only the 25th percentile, median and 75th percentile are published. The minimum and maximum of a cell are one clinic's exact quote and are neither stored nor served.",
        "Each clinic's contribution to a cell is capped before the statistics are computed, and no clinic may be more than half a sample. That dominance rule is enforced when the aggregate is computed and cannot be re-derived from a stored row, because the per-clinic breakdown is deliberately never stored.",
        "Prescription-only medicines are excluded entirely. UK law does not permit advertising them to the public by name, and a price band beside a medicine's name is advertising whatever the wording around it.",
        "Rows are pinned to a single computation day so a half-finished run cannot mix two days' figures. A run that did not finish publishes fewer cells rather than inconsistent ones.",
        "Quotes are excluded where the brief was for treatment abroad or a remote consultation, and non-GBP quotes are dropped rather than converted — we hold no exchange rate for the day a quote was written."
      ],
      "distributions": [
        {
          "label": "Full dataset (JSON)",
          "href": "/api/open-data/treatment-prices.json",
          "format": "application/json",
          "note": "National and city bands, disclosure rules, withheld-cell counts, limitations and licence."
        },
        {
          "label": "Schema (JSON)",
          "href": "/api/open-data/treatment-prices/schema.json",
          "format": "application/json",
          "note": "Column-by-column documentation, including what is deliberately absent."
        },
        {
          "label": "UK-wide bands (CSV)",
          "href": "/api/open-data/treatment-prices/national.csv",
          "format": "text/csv",
          "note": "One row per treatment across the UK."
        },
        {
          "label": "City bands (CSV)",
          "href": "/api/open-data/treatment-prices/cities.csv",
          "format": "text/csv",
          "note": "One row per treatment per city."
        }
      ],
      "publishedHere": true
    },
    {
      "id": "regulator-transparency",
      "title": "Regulator transparency dataset",
      "summary": "Every credential check run against a UK regulator's register, and every credential status change observed, in aggregate: volume by regulator and month, transitions by direction, re-check coverage, and the checks we could not complete.",
      "page": "/regulator-transparency",
      "schema": "/api/open-data/regulator-transparency/schema.json",
      "updateCadence": "Recomputed on demand and cached for 10 minutes, over a rolling window of complete calendar months.",
      "keywords": [
        "UK aesthetics regulation",
        "credential verification",
        "regulator registers",
        "open data"
      ],
      "limitations": [
        "Describes our checking of public registers. It is not a regulator's own record and not a census of UK providers.",
        "Aggregate only, with small transition cells withheld to prevent re-identification of a single business.",
        "Full limitations, derivations and licence are published on the dataset's own page."
      ],
      "distributions": [
        {
          "label": "Full dataset (JSON)",
          "href": "/api/open-data/regulator-transparency.json",
          "format": "application/json",
          "note": "Every table plus derivations, limitations and licence."
        },
        {
          "label": "Schema (JSON)",
          "href": "/api/open-data/regulator-transparency/schema.json",
          "format": "application/json",
          "note": "Column-by-column documentation of the shape."
        },
        {
          "label": "Monthly by regulator (CSV)",
          "href": "/api/open-data/regulator-transparency/monthly.csv",
          "format": "text/csv",
          "note": "One row per month per regulator."
        },
        {
          "label": "Totals by regulator (CSV)",
          "href": "/api/open-data/regulator-transparency/regulators.csv",
          "format": "text/csv",
          "note": "One row per regulator across the window."
        },
        {
          "label": "Status transitions (CSV)",
          "href": "/api/open-data/regulator-transparency/transitions.csv",
          "format": "text/csv",
          "note": "Previous status, new status, direction and count."
        }
      ],
      "publishedHere": false
    }
  ],
  "availabilityNote": "This catalogue lists what is published. It does not assert that every dataset can be built right now — a dataset that cannot be computed answers 503 with a reason rather than serving zeros."
}