Alpine Market

Data API reference

The Alpine Market public Data API (v1) exposes property facts, comparables, and the recorded transaction registry, read-only, over HTTPS. Every response is wrapped in the same envelope so you always know how fresh, confident, and licensed a value is, not just what it is.

The envelope

Every endpoint below returns this shape. data holds the payload (an object, an array, or null when nothing was found or the API is unavailable). The metadata fields sit alongside it.

{
  "data": /* endpoint-specific payload, or null */,
  "as_of": "2026-07-09T08:00:00.000Z",       // ISO timestamp the data was current as of
  "source_summary": "Plain-English data source",
  "confidence": 0.82,                          // 0-1, or null if not applicable
  "licence": "Terms governing reuse of this response",
  "visibility": "public",                      // the tier this response was filtered to
  "data_quality_notes": null                   // caveats, or null
}

Licence and confidence model

Every material fact in Alpine Market carries a source, a confidence score, and a licence, all the way down to the individual field (see property_facts in our data model). The public API surfaces a response-level roll-up of that provenance today; per-field provenance is on the roadmap for professional-tier API access. A missing or null confidence means the value is a directly-observed fact rather than a modeled estimate, not that it is untrustworthy.

What is not in this API

Owner and transaction-party identity (buyer, seller, notary, broker names) is excluded from every public endpoint, by construction: the routes below never query the parties or transaction_parties tables. That data is available to verified professional accounts only, through the Alpine Professional terminal, not this API.

Access and rate limits

All endpoints are read-only GET requests and require no authentication during this preview. Browsing APIs share limits of 240 requests per minute and 3,000 per hour per client network address; past that the API answers 429 with a Retry-After header, in the same response envelope as every other endpoint. These limits hold across server instances and include listing search, maps and address lookup. An unavailable quota service returns 503 with Retry-After. Pages and page sizes must be integers from 1 to 100; narrow your filters for deeper results. Bulk export and commercial licensing are handled through Alpine Professional.

Endpoints

GET/api/v1/search/address

Search properties by free-text address. Ranked by match exactness then data completeness.

Query params: q (required): search text matched against street, postal code, city.

Example request

GET /api/v1/search/address?q=Bahnhofstrasse%20Zurich

Example response

{
  "data": [
    {
      "property_id": "6a1c...e2f0",
      "address": "Bahnhofstrasse 1, 8001 Zurich",
      "canton": "ZH",
      "property_type": "office"
    }
  ],
  "as_of": "2026-07-09T08:00:00.000Z",
  "source_summary": "Alpine Market property index: aggregated Swiss listing portals plus enrichment from official registries.",
  "confidence": null,
  "licence": "Alpine Market Public Data API v1: evaluation and non-commercial use...",
  "visibility": "public",
  "data_quality_notes": null
}
GET/api/v1/properties/{id}

Core physical and cadastral facts for one property: address, geo, rooms, areas, year built, energy label, EGID/EDID/EWID. Public fields only.

Example request

GET /api/v1/properties/6a1c1e2f-0000-0000-0000-000000000000

Example response

{
  "data": {
    "property_id": "6a1c...e2f0",
    "category": "residential",
    "property_type": "apartment",
    "city": "Zurich",
    "canton": "ZH",
    "postal_code": "8001",
    "rooms": 3.5,
    "living_area_sqm": 82,
    "year_built": 1998,
    "data_completeness_score": 74,
    "...": "..."
  },
  "as_of": "2026-07-09T08:00:00.000Z",
  "source_summary": "Alpine Market property index (Swiss listing portals, enriched from official registries).",
  "confidence": 0.74,
  "licence": "Alpine Market Public Data API v1: evaluation and non-commercial use...",
  "visibility": "public",
  "data_quality_notes": null
}
GET/api/v1/properties/{id}/transactions

Recorded sale/transfer history for the property: registered prices and dates. Never includes buyer, seller, notary, or broker names.

Example request

GET /api/v1/properties/6a1c1e2f-0000-0000-0000-000000000000/transactions

Example response

{
  "data": [
    {
      "transaction_id": "9f2b...",
      "transaction_type": "open_market",
      "registration_date": "2021-03-15",
      "gross_consideration": 1250000,
      "currency": "CHF",
      "normalized_chf": 1250000,
      "arm_length": "arm_length",
      "status": "active",
      "confidence": 0.9,
      "object_role": "primary",
      "allocated_price": 1250000,
      "allocation_method": "source_provided",
      "source_document_url": null
    }
  ],
  "as_of": "2026-07-09T08:00:00.000Z",
  "source_summary": "Alpine Market transaction registry (recorded transfers, where available).",
  "confidence": 0.9,
  "licence": "Alpine Market Public Data API v1: evaluation and non-commercial use...",
  "visibility": "public",
  "data_quality_notes": null
}
GET/api/v1/properties/{id}/valuation

Latest Alpine Estimate for the property: the AVM output, method, and confidence band.

Example request

GET /api/v1/properties/6a1c1e2f-0000-0000-0000-000000000000/valuation

Example response

{
  "data": {
    "channel": "sale",
    "estimate": 1180000,
    "low": 1080000,
    "high": 1280000,
    "confidence": 0.72,
    "method": "comps_v0",
    "comp_count": 6,
    "model_version": null,
    "as_of": "2026-07-01T00:00:00.000Z"
  },
  "as_of": "2026-07-01T00:00:00.000Z",
  "source_summary": "Alpine Estimate (comparable-sales AVM).",
  "confidence": 0.72,
  "licence": "Alpine Market Public Data API v1: evaluation and non-commercial use...",
  "visibility": "public",
  "data_quality_notes": null
}
GET/api/v1/properties/{id}/comparables

Up to 10 comparable active listings: same canton, same property type, rooms within +/-1.

Example request

GET /api/v1/properties/6a1c1e2f-0000-0000-0000-000000000000/comparables

Example response

{
  "data": [
    {
      "property_id": "b0e4...",
      "listing_id": "22f1...",
      "slug": "apartment-8001-zurich-b0e4",
      "channel": "sale",
      "city": "Zurich",
      "canton": "ZH",
      "property_type": "apartment",
      "rooms": 3.5,
      "living_area_sqm": 78,
      "price": 1150000,
      "currency": "CHF",
      "price_unit": "total"
    }
  ],
  "as_of": "2026-07-09T08:00:00.000Z",
  "source_summary": "Alpine Market active listing index, matched by canton, property type, and rooms band (+/-1).",
  "confidence": null,
  "licence": "Alpine Market Public Data API v1: evaluation and non-commercial use...",
  "visibility": "public",
  "data_quality_notes": null
}
GET/api/v1/market-stats

Weekly median ASKING price per square metre of active listings, by canton and Switzerland-wide, with the number of priced listings behind each median. Asking prices, not sale prices. Add format=csv for a CSV download.

Query params: format (optional): csv.

Example request

GET /api/v1/market-stats

Example response

{
  "data": {
    "capturedAt": "2026-09-06T07:00:00.000Z",
    "national": { "sale": { "median": 10500, "sampleSize": 4000, "published": true }, "rent": { "median": 30, "sampleSize": 2800, "published": true } },
    "cantons": [
      { "canton": "ZH", "label": "Zurich", "sale": { "median": 12000, "sampleSize": 4600, "published": true }, "rent": { "median": 32, "sampleSize": 2823, "published": true } }
    ],
    "minSample": 30,
    "measure": "median_asking_price_chf_per_sqm"
  },
  "as_of": "2026-09-06T07:00:00.000Z",
  "source_summary": "Alpine Market weekly market snapshot: median asking price per square metre of active listings by canton, with sample sizes. Asking prices, not sale prices.",
  "confidence": null,
  "licence": "Alpine Market Public Data API v1: evaluation and non-commercial use...",
  "visibility": "public",
  "data_quality_notes": "A median is published only from 30 or more priced listings; sample_size is always carried."
}
GET/api/v1/transactions/communes

Recorded property sales by commune over the last twelve months: sales count and median RECORDED sale price in CHF (market-type transfers only, published from 30 priced sales). Recorded sale prices, not asking prices. Geneva only today. Add format=csv for a CSV download.

Query params: jurisdiction (optional, default CH-GE): the only supported value today. format (optional): csv.

Example request

GET /api/v1/transactions/communes?jurisdiction=CH-GE

Example response

{
  "data": {
    "rows": [
      { "commune": "Vernier", "salesCount": 276, "medianPrice": 1250000, "medianSampleSize": 223 },
      { "commune": "Troinex", "salesCount": 34, "medianPrice": null, "medianSampleSize": 26 }
    ],
    "periodFrom": "2025-09-10",
    "periodTo": "2026-09-10",
    "sources": ["Feuille d'avis officielle"],
    "minSample": 30,
    "measure": "median_recorded_sale_price_chf",
    "failed": []
  },
  "as_of": "2026-09-10",
  "source_summary": "Alpine Market transaction registry, Feuille d'avis officielle du canton de Geneve: recorded sale prices by commune, twelve months. Recorded sale prices, not asking prices.",
  "confidence": null,
  "licence": "Alpine Market Public Data API v1: evaluation and non-commercial use...",
  "visibility": "public",
  "data_quality_notes": "Period 2025-09-10 to 2026-09-10. A median is published only from 30 priced market-type sales; counts are always published. No party is named."
}

Need more than the public API?

Owner lookups, transaction-party data, bulk export, and higher rate limits are available to verified professionals.

Explore Alpine Professional