openapi: 3.1.0
info:
  title: Placepoint API
  version: 0.3.0
  summary: Norwegian and Swedish property, company and area data over one REST API.
  description: |
    The Placepoint API is one REST API for the data behind Placepoint Fusion:
    properties keyed on matrikkelnummer, companies keyed on ISO 6523
    identifiers, areas, and subscriptions for change events.

    Conventions, authentication, identifiers and a quickstart:
    https://docs.placepoint.no/developer/guide/. Norwegian product pages per
    endpoint group: https://docs.placepoint.no/api/.
  contact:
    name: Placepoint support
    email: support@placepoint.no
    url: https://placepoint.no/selskap/kontakt
  license:
    name: Placepoint API Terms
servers:
  - url: https://data.placepoint.no
    description: Production. Same host as today's Data API; api.placepoint.no takes over once the PropCloud APIs behind it are shut down.
security:
  - oauth2: []
tags:
  - name: Addresses
    description: Resolve an address to properties.
  - name: Coordinates
    description: What sits at a coordinate.
  - name: Properties
    description: Everything keyed on a matrikkelnummer.
  - name: Companies
    description: Everything keyed on an organization identifier.
  - name: Areas
    description: Statistics and tenders for a kommune, grunnkrets or postal code.
  - name: Subscriptions
    description: Change events delivered as signed CloudEvents webhooks.
  - name: Platform
    description: Tokens, identity, discovery.
paths:
  /.well-known/api-catalog:
    get:
      operationId: getApiCatalog
      tags: [Platform]
      summary: API catalog
      description: Lists the API with its status, scopes and links to spec, docs and changelog, per the IETF api-catalog draft.
      security: []
      responses:
        "200":
          description: The catalog.
          content:
            application/linkset+json:
              schema: { $ref: "#/components/schemas/ApiCatalog" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /openapi.yaml:
    get:
      operationId: getOpenApiSpec
      tags: [Platform]
      summary: This specification
      description: The OpenAPI document for the running version, same artifact as the deployed code.
      security: []
      responses:
        "200":
          description: The spec.
          content:
            application/yaml:
              schema: { type: string, description: OpenAPI 3.1 document. }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /addresses/{country}/{address}:
    get:
      operationId: getAddress
      tags: [Addresses]
      x-placepoint-page: /api/adresser
      summary: Resolve an address
      description: |
        Returns the properties that match an address text, best match first,
        each with its cadastreId so the rest of the API can be called. Norway
        matches against Kartverket's adresseregister; Sweden against
        Lantmäteriet via Combify. Partial addresses return several matches.

        Produktside: [Adresser til matrikkelnummer](https://docs.placepoint.no/api/adresser).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - name: address
          in: path
          required: true
          description: URL-encoded address text, e.g. "Karl Johans gate 1, Oslo".
          schema: { type: string, minLength: 3, maxLength: 200 }
          example: Karl Johans gate 1, Oslo
      responses:
        "200":
          description: Matching properties.
          content:
            application/json:
              schema:
                type: object
                description: Matches wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: Best match first.
                    items: { $ref: "#/components/schemas/Address" }
              example:
                items:
                  - text: Karl Johans gate 1, 0154 Oslo
                    streetName: Karl Johans gate
                    houseNumber: "1"
                    postalCode: "0154"
                    postalPlace: Oslo
                    country: "NO"
                    cadastreId: 0301-207-419-0-0
                    location: { lat: 59.9111, lon: 10.7528 }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /coordinates/{country}/{lat}/{lon}:
    get:
      operationId: getCoordinate
      tags: [Coordinates]
      x-placepoint-page: /api/koordinater
      summary: Resolve a coordinate
      description: |
        Returns what sits at a WGS84 coordinate: the property whose registered
        boundary covers the point (if any), its buildings, and the addresses
        on it. A coordinate that falls outside every registered property
        returns no property and empty buildings and addresses arrays.

        Produktside: [Fra koordinat til eiendom](https://docs.placepoint.no/api/koordinater).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - name: lat
          in: path
          required: true
          description: Latitude in WGS84 decimal degrees.
          schema: { type: number, minimum: -90, maximum: 90 }
          example: 59.9075
        - name: lon
          in: path
          required: true
          description: Longitude in WGS84 decimal degrees.
          schema: { type: number, minimum: -180, maximum: 180 }
          example: 10.7563
      responses:
        "200":
          description: What sits at the coordinate.
          content:
            application/json:
              schema:
                type: object
                description: The covering property, its buildings and its addresses.
                required: [buildings, addresses]
                properties:
                  property: { $ref: "#/components/schemas/Property" }
                  buildings:
                    type: array
                    description: Buildings at the point.
                    items: { $ref: "#/components/schemas/Building" }
                  addresses:
                    type: array
                    description: Addresses at the point.
                    items: { $ref: "#/components/schemas/Address" }
              example:
                property:
                  country: "NO"
                  cadastreId: 0301-207-76-0-0
                  municipality: { code: "0301", name: Oslo }
                  areaM2: 620
                  plotCount: 1
                  propertyType: EIERSEKSJON
                  addresses:
                    - text: Dronning Eufemias gate 16, 0191 Oslo
                      streetName: Dronning Eufemias gate
                      houseNumber: "16"
                      postalCode: "0191"
                      postalPlace: Oslo
                      country: "NO"
                      cadastreId: 0301-207-76-0-0
                      location: { lat: 59.9075, lon: 10.7563 }
                  links:
                    - { href: "https://data.placepoint.no/properties/NO/0301-207-76-0-0/sections", title: Sections }
                    - { href: "https://data.placepoint.no/properties/NO/0301-207-76-0-0/buildings", title: Buildings }
                    - { href: "https://data.placepoint.no/properties/NO/0301-207-76-0-0/units", title: Units }
                buildings:
                  - buildingNumber: "1"
                    buildingType: { code: "141", name: Boligblokk }
                    status: IN_USE
                    builtYear: 2015
                    floors: 12
                    grossAreaM2: 8400
                    usableAreaM2: 7600
                    footprintM2: 700
                    location: { lat: 59.9075, lon: 10.7563 }
                addresses:
                  - text: Dronning Eufemias gate 16, 0191 Oslo
                    streetName: Dronning Eufemias gate
                    houseNumber: "16"
                    postalCode: "0191"
                    postalPlace: Oslo
                    country: "NO"
                    cadastreId: 0301-207-76-0-0
                    location: { lat: 59.9075, lon: 10.7563 }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}:
    get:
      operationId: getProperty
      tags: [Properties]
      x-placepoint-page: /api/eiendommer
      summary: Get a property
      description: |
        Returns a property by its cadastreId, with links to its sub-resources:
        sections, buildings and units.

        Produktside: [Eiendommer](https://docs.placepoint.no/api/eiendommer).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: The property.
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Property" }
              examples:
                norway:
                  summary: Norwegian property
                  value:
                    country: "NO"
                    cadastreId: 0301-207-76-0-0
                    municipality: { code: "0301", name: Oslo }
                    areaM2: 620
                    plotCount: 1
                    propertyType: EIERSEKSJON
                    buildingCount: 1
                    sectionCount: 44
                    unitCount: 52
                    totalUsableAreaM2: 26400
                    totalGrossAreaM2: 28900
                    builtOverAreaM2: 2050
                    builtOverAreaPct: 33.1
                    averageFloors: 13
                    taxationValue: { amount: "412000000.00", currency: NOK }
                    establishedDate: "1998-03-11"
                    location: { lat: 59.9075, lon: 10.7563 }
                    addresses:
                      - text: Dronning Eufemias gate 16, 0191 Oslo
                        streetName: Dronning Eufemias gate
                        houseNumber: "16"
                        postalCode: "0191"
                        postalPlace: Oslo
                        country: "NO"
                        cadastreId: 0301-207-76-0-0
                        location: { lat: 59.9075, lon: 10.7563 }
                    links:
                      - { href: "https://data.placepoint.no/properties/NO/0301-207-76-0-0/sections", title: Sections }
                      - { href: "https://data.placepoint.no/properties/NO/0301-207-76-0-0/buildings", title: Buildings }
                      - { href: "https://data.placepoint.no/properties/NO/0301-207-76-0-0/units", title: Units }
                sweden:
                  summary: Swedish property
                  value:
                    country: "SE"
                    cadastreId: 0184_svardsliljan_1_1
                    municipality: { code: "0184", name: Solna }
                    areaM2: 1450
                    plotCount: 1
                    propertyType: FASTIGHET
                    addresses:
                      - text: "Solkraftsvagen 2, 171 41 Solna"
                        streetName: Solkraftsvagen
                        houseNumber: "2"
                        postalCode: "171 41"
                        postalPlace: Solna
                        country: "SE"
                        cadastreId: 0184_svardsliljan_1_1
                        location: { lat: 59.3624, lon: 17.9884 }
                    links:
                      - { href: "https://data.placepoint.no/properties/SE/0184_svardsliljan_1_1/sections", title: Sections }
                      - { href: "https://data.placepoint.no/properties/SE/0184_svardsliljan_1_1/buildings", title: Buildings }
                      - { href: "https://data.placepoint.no/properties/SE/0184_svardsliljan_1_1/units", title: Units }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/sections:
    get:
      operationId: listPropertySections
      tags: [Properties]
      x-placepoint-page: /api/eiendommer
      summary: List a property's sections
      description: |
        Lists the sections (eierseksjoner) registered on the property, each
        with its ownership share and owners. Owners are always returned, but
        a Person owner's name is included only when the caller also holds the
        owners.read scope; without it, name is omitted and only birthYear
        (when known) is returned.

        Produktside: [Eiendommer](https://docs.placepoint.no/api/eiendommer).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: Sections on the property.
          content:
            application/json:
              schema:
                type: object
                description: Sections wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per section.
                    items: { $ref: "#/components/schemas/Section" }
              example:
                items:
                  - sectionNumber: "15"
                    cadastreId: 0301-207-76-0-0
                    share: { numerator: 1, denominator: 1 }
                    owners:
                      - kind: ORGANIZATION
                        organization:
                          organizationIdentifier: { scheme: "0192", id: "987654321" }
                          name: Eufemia Eiendom AS
                          country: "NO"
                        share: { numerator: 1, denominator: 2 }
                        registeredAt: "2019-06-01T00:00:00Z"
                      - kind: PERSON
                        person: { birthYear: 1978 }
                        share: { numerator: 1, denominator: 2 }
                        registeredAt: "2020-01-15T00:00:00Z"
                    useType: NAERING
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/buildings:
    get:
      operationId: listPropertyBuildings
      tags: [Properties]
      x-placepoint-page: /api/bygg
      summary: List a property's buildings
      description: |
        Lists the buildings (bygninger) registered on the property, from
        Matrikkelen for Norway and the corresponding Swedish building
        register via Combify.

        Produktside: [Bygg og bruksenheter](https://docs.placepoint.no/api/bygg).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: Buildings on the property.
          content:
            application/json:
              schema:
                type: object
                description: Buildings wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per building.
                    items: { $ref: "#/components/schemas/Building" }
              example:
                items:
                  - buildingNumber: "1"
                    buildingType: { code: "141", name: Boligblokk }
                    status: IN_USE
                    builtYear: 2015
                    floors: 12
                    grossAreaM2: 8400
                    usableAreaM2: 7600
                    footprintM2: 700
                    residentialUsableAreaM2: 6900
                    otherUsableAreaM2: 700
                    builtOverAreaM2: 700
                    builtOverAreaPct: 33.1
                    dwellingUnitCount: 48
                    hasLift: true
                    waterSupply: PUBLIC
                    sewerage: PUBLIC
                    energySources: [ELECTRICITY, DISTRICT_HEATING]
                    heatingTypes: [CENTRAL, UNDERFLOOR]
                    usageGroup: RESIDENTIAL
                    registrationOrigin: ORDINARY_REGISTRATION
                    isCulturalHeritage: false
                    isSefrakRegistered: false
                    elevation: { baseElevationM: 3.2, highestPointM: 41.8, heightAboveGroundM: 38.6 }
                    statusHistory:
                      - { status: UNDER_CONSTRUCTION, changedDate: "2013-04-18", registeredDate: "2013-04-22" }
                      - { status: IN_USE, changedDate: "2015-08-27", registeredDate: "2015-09-02", reason: Ferdigattest }
                    floorDetails:
                      - { floorNumber: 1, floorKind: GROUND, usableAreaM2: 640, roomCount: 12, dwellingUnitCount: 4 }
                      - { floorNumber: 2, floorKind: MAIN, usableAreaM2: 610, roomCount: 14, dwellingUnitCount: 4 }
                    location: { lat: 59.9075, lon: 10.7563 }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/units:
    get:
      operationId: listPropertyUnits
      tags: [Properties]
      x-placepoint-page: /api/bygg
      summary: List a property's units
      description: |
        Lists the residential and commercial units (bruksenheter) registered
        within the property's buildings, each with its own address.

        Produktside: [Bygg og bruksenheter](https://docs.placepoint.no/api/bygg).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: Units on the property.
          content:
            application/json:
              schema:
                type: object
                description: Units wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per unit.
                    items: { $ref: "#/components/schemas/Unit" }
              example:
                items:
                  - unitNumber: H0301
                    buildingNumber: "1"
                    floor: 8
                    usableAreaM2: 74
                    useType: BOLIG
                    cadastreId: 0301-207-76-0-44
                    grossAreaM2: 81
                    primaryRoomAreaM2: 70
                    roomCount: 3
                    bathroomCount: 1
                    toiletCount: 1
                    kitchenAccess: OWN_KITCHEN
                    ownershipForm: FREEHOLD
                    energyLabel: C
                    toBeDecommissioned: false
                    address:
                      text: Dronning Eufemias gate 16, 0191 Oslo
                      streetName: Dronning Eufemias gate
                      houseNumber: "16"
                      postalCode: "0191"
                      postalPlace: Oslo
                      country: "NO"
                      cadastreId: 0301-207-76-0-0
                      location: { lat: 59.9075, lon: 10.7563 }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/lookups:
    post:
      operationId: createPropertyLookups
      tags: [Properties]
      x-placepoint-page: /api/eiendommer
      summary: Look up properties in bulk
      description: |
        Looks up up to 100 cadastreIds in one call and returns whichever
        properties resolve, plus a notFound list for the rest. Each requested
        id counts as one call against the properties.read quota, whether or
        not it resolves. Idempotency-Key replays the same response to a
        retried request for 24 hours. A 404 means the country's cadastre
        register itself is not served; an individual id that does not
        resolve within a served register comes back in notFound, not as a 404.

        Produktside: [Eiendommer](https://docs.placepoint.no/api/eiendommer).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/idempotencyKey"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: Cadastre ids to look up.
              required: [cadastreIds]
              additionalProperties: false
              properties:
                cadastreIds:
                  type: array
                  description: Cadastre identifiers to look up, one per id against the quota.
                  minItems: 1
                  maxItems: 100
                  items: { type: string }
            example:
              cadastreIds: [0301-207-76-0-0]
      responses:
        "200":
          description: Looked-up properties.
          content:
            application/json:
              schema:
                type: object
                description: Found properties plus any ids that did not resolve.
                required: [items, notFound]
                properties:
                  items:
                    type: array
                    description: Properties found, one per resolved id.
                    items: { $ref: "#/components/schemas/Property" }
                  notFound:
                    type: array
                    description: Cadastre ids that did not resolve to a property.
                    items: { type: string }
              example:
                items:
                  - country: "NO"
                    cadastreId: 0301-207-76-0-0
                    municipality: { code: "0301", name: Oslo }
                    areaM2: 620
                    plotCount: 1
                    propertyType: EIERSEKSJON
                    addresses:
                      - text: Dronning Eufemias gate 16, 0191 Oslo
                        streetName: Dronning Eufemias gate
                        houseNumber: "16"
                        postalCode: "0191"
                        postalPlace: Oslo
                        country: "NO"
                        cadastreId: 0301-207-76-0-0
                        location: { lat: 59.9075, lon: 10.7563 }
                    links:
                      - { href: "https://data.placepoint.no/properties/NO/0301-207-76-0-0/sections", title: Sections }
                      - { href: "https://data.placepoint.no/properties/NO/0301-207-76-0-0/buildings", title: Buildings }
                      - { href: "https://data.placepoint.no/properties/NO/0301-207-76-0-0/units", title: Units }
                notFound: []
        "400": { $ref: "#/components/responses/BadRequest" }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/owners:
    get:
      operationId: listPropertyOwners
      tags: [Properties]
      x-placepoint-page: /api/eiere
      summary: List a property's owners
      description: |
        Lists the rights holders (hjemmelshavere) registered on the property
        as a whole, across all its sections. Owners are always returned, but
        a Person owner's name is included only when the caller also holds
        the owners.read scope; without it, name is omitted and only
        birthYear (when known) is returned, matching the sections endpoint.

        Produktside: [Eiere](https://docs.placepoint.no/api/eiere).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: Owners of the property.
          content:
            application/json:
              schema:
                type: object
                description: Owners wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per owner.
                    items: { $ref: "#/components/schemas/Owner" }
              example:
                items:
                  - kind: ORGANIZATION
                    organization:
                      organizationIdentifier: { scheme: "0192", id: "987654321" }
                      name: Eufemia Eiendom AS
                      country: "NO"
                    share: { numerator: 1, denominator: 1 }
                    registeredAt: "2019-06-01T00:00:00Z"
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/tenants:
    get:
      operationId: listPropertyTenants
      tags: [Properties]
      x-placepoint-page: /api/leietakere
      summary: List a property's tenants
      description: |
        Lists the companies with a registered business address on the
        property, sourced from Brønnøysundregistrenes Enhetsregisteret and
        refreshed nightly. verification.source states whether a tenant is
        confirmed by the register, observed from other signals, or both;
        confidence and lastSeenAt qualify how current the signal is.

        Produktside: [Leietakere](https://docs.placepoint.no/api/leietakere).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: Tenants of the property.
          content:
            application/json:
              schema:
                type: object
                description: Tenants wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per tenant.
                    items: { $ref: "#/components/schemas/Tenant" }
              example:
                items:
                  - organization:
                      organizationIdentifier: { scheme: "0192", id: "923456789" }
                      name: Nordic Consulting AS
                      country: "NO"
                    verification: { source: ENHETSREGISTERET, confidence: HIGH, lastSeenAt: "2026-08-15T02:00:00Z" }
                    employees: 42
                    naceCode: "70.220"
                    naceName: Bedriftsrådgivning
                    unitNumber: H0301
                    legalForm: Aksjeselskap
                    foundedDate: "2009-02-16"
                    movedInDate: "2019-07-01"
                    website: "https://example.no"
                    isOwner: false
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/transactions:
    get:
      operationId: listPropertyTransactions
      tags: [Properties]
      x-placepoint-page: /api/transaksjoner
      summary: List a property's transactions
      description: |
        Lists recorded sales (tinglyste hjemmelsoverganger) of the property
        or a share of it, newest first, from Kartverket's Tinglysing.
        Buyers and sellers are returned as owners; a Person owner's name is
        included only with the owners.read scope, otherwise it is omitted
        and only birthYear (when known) is returned.

        Produktside: [Transaksjoner](https://docs.placepoint.no/api/transaksjoner).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
        - $ref: "#/components/parameters/pageSize"
        - $ref: "#/components/parameters/pageToken"
      responses:
        "200":
          description: Transactions on the property.
          content:
            application/json:
              schema:
                type: object
                description: Transactions wrapped in an object, cursor-paginated.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per transaction, newest first.
                    items: { $ref: "#/components/schemas/Transaction" }
                  nextPageToken: { type: string, description: Cursor for the next page; absent on the last page. }
              example:
                items:
                  - id: txn_8f3a1c
                    registeredAt: "2022-03-14T00:00:00Z"
                    kind: SALE
                    price: { amount: "12500000.00", currency: NOK }
                    share: { numerator: 1, denominator: 1 }
                    buyers:
                      - kind: ORGANIZATION
                        organization: { organizationIdentifier: { scheme: "0192", id: "987654321" }, name: Eufemia Eiendom AS, country: "NO" }
                        share: { numerator: 1, denominator: 1 }
                        registeredAt: "2022-03-14T00:00:00Z"
                    sellers:
                      - kind: PERSON
                        person: { birthYear: 1965 }
                        share: { numerator: 1, denominator: 1 }
                        registeredAt: "2022-03-14T00:00:00Z"
                    source: KARTVERKET_TINGLYSING
                nextPageToken: eyJvZmZzZXQiOjF9
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/comparable-transactions:
    get:
      operationId: listComparableTransactions
      tags: [Properties]
      x-placepoint-page: /api/sammenlignbare-salg
      summary: List comparable transactions
      description: |
        Lists recent sales of similar nearby properties, ranked by
        similarity, to support a valuation. Each entry carries every
        Transaction field plus its distance from the property, its price
        per square metre, and a similarity score. Buyers and sellers are
        owners; a Person owner's name is included only with the
        owners.read scope.

        Produktside: [Sammenlignbare salg](https://docs.placepoint.no/api/sammenlignbare-salg).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: Comparable transactions.
          content:
            application/json:
              schema:
                type: object
                description: Comparable transactions wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per comparable transaction, most similar first.
                    items: { $ref: "#/components/schemas/ComparableTransaction" }
              example:
                items:
                  - id: txn_c19d2b
                    registeredAt: "2023-11-02T00:00:00Z"
                    kind: SALE
                    price: { amount: "11800000.00", currency: NOK }
                    share: { numerator: 1, denominator: 1 }
                    buyers:
                      - kind: ORGANIZATION
                        organization: { organizationIdentifier: { scheme: "0192", id: "911222333" }, name: Bjorvika Bolig AS, country: "NO" }
                        share: { numerator: 1, denominator: 1 }
                        registeredAt: "2023-11-02T00:00:00Z"
                    sellers:
                      - kind: PERSON
                        person: { birthYear: 1972 }
                        share: { numerator: 1, denominator: 1 }
                        registeredAt: "2023-11-02T00:00:00Z"
                    source: KARTVERKET_TINGLYSING
                    distanceM: 180
                    pricePerM2: { amount: "159459.00", currency: NOK }
                    similarity: 0.86
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/valuations:
    get:
      operationId: getPropertyValuations
      tags: [Properties]
      x-placepoint-page: /api/verdivurdering
      summary: Get a property's valuation
      description: |
        Returns the current estimated value and rent for the property: a
        point estimate with a low-high range for both sale value and rent
        per square metre per year, the valuation method, and when it was
        computed.

        Produktside: [Verdivurdering](https://docs.placepoint.no/api/verdivurdering).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: The property's valuation.
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Valuation" }
              example:
                value:
                  estimate: { amount: "13200000.00", currency: NOK }
                  low: { amount: "12100000.00", currency: NOK }
                  high: { amount: "14300000.00", currency: NOK }
                rent:
                  estimatePerM2Year: { amount: "3200.00", currency: NOK }
                  low: { amount: "2900.00", currency: NOK }
                  high: { amount: "3500.00", currency: NOK }
                method: AVM
                valuedAt: "2026-08-01T00:00:00Z"
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/energy-certificates:
    get:
      operationId: listEnergyCertificates
      tags: [Properties]
      x-placepoint-page: /api/energi
      summary: List a property's energy certificates
      description: |
        Lists the energy certificates issued for the property's buildings:
        energiattester from Enova's register for Norway, energideklarationer
        from Boverket for Sweden.

        Produktside: [Energiattester](https://docs.placepoint.no/api/energi).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: Energy certificates for the property.
          content:
            application/json:
              schema:
                type: object
                description: Energy certificates wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per certificate.
                    items: { $ref: "#/components/schemas/EnergyCertificate" }
              example:
                items:
                  - buildingNumber: "1"
                    label: C
                    heatingGrade: YELLOW
                    issuedDate: "2021-05-10"
                    validToDate: "2031-05-10"
                    source: ENOVA
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/certifications:
    get:
      operationId: listCertifications
      tags: [Properties]
      x-placepoint-page: /api/sertifiseringer
      summary: List a property's certifications
      description: |
        Lists environmental certifications held for the property's
        buildings, such as BREEAM-NOR at completion or BREEAM In-Use for
        an operating building.

        Produktside: [Miljøsertifiseringer](https://docs.placepoint.no/api/sertifiseringer).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: Certifications for the property.
          content:
            application/json:
              schema:
                type: object
                description: Certifications wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per certification.
                    items: { $ref: "#/components/schemas/Certification" }
              example:
                items:
                  - scheme: BREEAM_NOR
                    rating: Very Good
                    certifiedDate: "2020-09-01"
                    certifiedAreaM2: 8400
                    buildingNumber: "1"
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/zoning-plans:
    get:
      operationId: listZoningPlans
      tags: [Properties]
      x-placepoint-page: /api/reguleringsplaner
      summary: List a property's zoning plans
      description: |
        Lists the reguleringsplaner that cover the property, proposed,
        adopted or repealed, each with its permitted purpose and any
        planning documents.

        Produktside: [Reguleringsplaner og utnyttelse](https://docs.placepoint.no/api/reguleringsplaner).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: Zoning plans covering the property.
          content:
            application/json:
              schema:
                type: object
                description: Zoning plans wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per plan.
                    items: { $ref: "#/components/schemas/ZoningPlan" }
              example:
                items:
                  - planId: S-5028
                    name: "Bjorvika, felt B13"
                    status: ADOPTED
                    purpose: Bolig og forretning
                    adoptedDate: "2011-06-15"
                    municipality: { code: "0301", name: Oslo }
                    documents:
                      - id: doc_9931a
                        kind: ZONING_PLAN
                        title: Reguleringsbestemmelser S-5028
                        publishedDate: "2011-06-20"
                        downloadUrl: "https://data.placepoint.no/files/doc_9931a?sig=ab12cd34ef56&exp=1893456000"
                        mediaType: application/pdf
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/utilization:
    get:
      operationId: getUtilization
      tags: [Properties]
      x-placepoint-page: /api/reguleringsplaner
      summary: Get a property's utilization
      description: |
        Returns the permitted and built utilization (utnyttelsesgrad) for
        the property under its zoning plan: allowed built-over percentage
        of plot area, allowed and built gross floor area, and what basis
        the figures rest on.

        Produktside: [Reguleringsplaner og utnyttelse](https://docs.placepoint.no/api/reguleringsplaner).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: The property's utilization.
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Utilization" }
              example:
                allowedBya: 60
                allowedBraM2: 9200
                builtBraM2: 8400
                remainingBraM2: 800
                basis: "Regulert i S-5028, felt B13"
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/building-permits:
    get:
      operationId: listBuildingPermits
      tags: [Properties]
      x-placepoint-page: /api/byggesaker
      summary: List a property's building permits
      description: |
        Lists building-permit cases for the property, newest first. Norway
        is sourced from the kommune case archives Placepoint holds; Sweden
        is bygglov cases via Combify.

        Produktside: [Byggesaker](https://docs.placepoint.no/api/byggesaker).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
        - $ref: "#/components/parameters/pageSize"
        - $ref: "#/components/parameters/pageToken"
      responses:
        "200":
          description: Building permits for the property.
          content:
            application/json:
              schema:
                type: object
                description: Building permits wrapped in an object, cursor-paginated.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per case, newest first.
                    items: { $ref: "#/components/schemas/BuildingPermit" }
                  nextPageToken: { type: string, description: Cursor for the next page; absent on the last page. }
              example:
                items:
                  - caseNumber: "202201234"
                    kind: Bruksendring
                    status: APPROVED
                    receivedDate: "2022-01-10"
                    decidedDate: "2022-04-22"
                    title: Bruksendring av lokaler til kontor
                    documents:
                      - id: doc_44120
                        kind: BUILDING_CASE
                        title: Vedtak 202201234
                        publishedDate: "2022-04-25"
                        downloadUrl: "https://data.placepoint.no/files/doc_44120?sig=ab12cd34ef56&exp=1893456000"
                        mediaType: application/pdf
                nextPageToken: eyJvZmZzZXQiOjF9
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/encumbrances:
    get:
      operationId: listEncumbrances
      tags: [Properties]
      x-placepoint-page: /api/heftelser
      summary: List a property's encumbrances
      description: |
        Lists heftelser (encumbrances) registered on the property:
        mortgages, easements, restraints on disposal and other tinglyste
        rights.

        Produktside: [Heftelser](https://docs.placepoint.no/api/heftelser).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: Encumbrances on the property.
          content:
            application/json:
              schema:
                type: object
                description: Encumbrances wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per encumbrance.
                    items: { $ref: "#/components/schemas/Encumbrance" }
              example:
                items:
                  - kind: MORTGAGE
                    securedAmount: { amount: "9500000.00", currency: NOK }
                    creditor:
                      organizationIdentifier: { scheme: "0192", id: "912345678" }
                      name: DNB Bank ASA
                      country: "NO"
                    registeredAt: "2019-06-01T00:00:00Z"
                    documentNumber: "2019-456789"
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/risks:
    get:
      operationId: getRisks
      tags: [Properties]
      x-placepoint-page: /api/risiko
      summary: Get a property's natural-hazard risks
      description: |
        Returns the assessed risk level for flood, landslide, quick clay
        (kvikkleire) and radon at the property. source names the
        leverandor behind each assessment: NVE for flood, landslide and
        quick clay, DSA (Direktoratet for strålevern og atomsikkerhet) for
        radon. A level of UNKNOWN means the underlying register does not
        yet cover the property, not that the property is judged risk-free.

        Produktside: [Naturfare](https://docs.placepoint.no/api/risiko).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: The property's risk assessment.
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Risk" }
              example:
                flood: { level: LOW, source: NVE, note: "Utenfor kartlagt flomsone, nær sjø." }
                landslide: { level: NONE, source: NVE, note: "Ikke i aktsomhetsområde." }
                quickClay: { level: MEDIUM, source: NVE, note: "Randsone av kvikkleiresone, ikke utredet i detalj." }
                radon: { level: LOW, source: DSA, note: "Lavrisikoområde." }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/housing-cooperative:
    get:
      operationId: getHousingCooperative
      tags: [Properties]
      x-placepoint-page: /api/borettslag
      summary: Get a property's housing cooperative
      description: |
        Returns the borettslag, sameie or aksjelag the property's unit
        belongs to, if any: the organization, its legal form, unit count,
        shared debt (fellesgjeld) and its latest filed financial statement.
        Returns 404 when the property is not organized under a housing
        cooperative.

        Produktside: [Borettslag og sameier](https://docs.placepoint.no/api/borettslag).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: The property's housing cooperative.
          content:
            application/json:
              schema: { $ref: "#/components/schemas/HousingCooperative" }
              example:
                organization:
                  organizationIdentifier: { scheme: "0192", id: "998877665" }
                  name: Sameiet Dronning Eufemias gate 16
                  country: "NO"
                kind: SAMEIE
                unitCount: 96
                sharedDebt: { amount: "3450000.00", currency: NOK }
                latestStatement: { year: 2025, currency: NOK }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/documents:
    get:
      operationId: listPropertyDocuments
      tags: [Properties]
      x-placepoint-page: /api/dokumenter
      summary: List a property's documents
      description: |
        Lists documents tied to the property: zoning-plan text, building
        case decisions, sales prospectuses and other tinglyste or public
        documents. Each downloadUrl is a signed URL valid for 15 minutes;
        request the list again for a fresh link once it expires.

        Produktside: [Dokumenter](https://docs.placepoint.no/api/dokumenter).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: Documents tied to the property.
          content:
            application/json:
              schema:
                type: object
                description: Documents wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per document.
                    items: { $ref: "#/components/schemas/Document" }
              example:
                items:
                  - id: doc_77213
                    kind: SALES_PROSPECTUS
                    title: Salgsoppgave DEG 16 H0301
                    publishedDate: "2015-09-01"
                    downloadUrl: "https://data.placepoint.no/files/doc_77213?sig=ab12cd34ef56&exp=1893456000"
                    mediaType: application/pdf
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/boundary:
    get:
      operationId: getPropertyBoundary
      tags: [Properties]
      x-placepoint-page: /api/kart
      summary: Get a property's boundary
      description: |
        Returns the property's registered boundary as a GeoJSON Feature.
        The underlying boundary data is not yet available for every
        kommune; a property in an uncovered kommune returns 404.

        Produktside: [Tomtegrenser](https://docs.placepoint.no/api/kart).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
      responses:
        "200":
          description: The property's boundary.
          content:
            application/geo+json:
              schema: { $ref: "#/components/schemas/GeoJsonFeature" }
              example:
                type: Feature
                geometry:
                  type: Polygon
                  coordinates:
                    - - [10.7561, 59.9074]
                      - [10.7565, 59.9074]
                      - [10.7565, 59.9077]
                      - [10.7561, 59.9077]
                      - [10.7561, 59.9074]
                properties: {}
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /properties/{country}/{cadastreId}/buildings/{buildingNumber}/footprint:
    get:
      operationId: getBuildingFootprint
      tags: [Properties]
      x-placepoint-page: /api/bygningsomriss
      summary: Get a building's footprint
      description: |
        Returns one building's ground footprint as a GeoJSON Feature.
        properties.heightM and properties.floors carry the building's
        height in meters and floor count alongside the geometry. The
        underlying footprint data is not yet available for every kommune;
        a building in an uncovered kommune, or a buildingNumber that does
        not exist on the property, returns 404.

        Produktside: [Bygningsomriss](https://docs.placepoint.no/api/bygningsomriss).
      security:
        - oauth2: [properties.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/cadastreId"
        - name: buildingNumber
          in: path
          required: true
          description: Bygningsnummer within the property, as returned by listPropertyBuildings.
          schema: { type: string }
          example: "1"
      responses:
        "200":
          description: The building's footprint.
          content:
            application/geo+json:
              schema: { $ref: "#/components/schemas/GeoJsonFeature" }
              example:
                type: Feature
                geometry:
                  type: Polygon
                  coordinates:
                    - - [10.75628, 59.90745]
                      - [10.75635, 59.90745]
                      - [10.75635, 59.90755]
                      - [10.75628, 59.90755]
                      - [10.75628, 59.90745]
                properties: { heightM: 42.5, floors: 12 }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /companies/{scheme}/{id}:
    get:
      operationId: getCompany
      tags: [Companies]
      x-placepoint-page: /api/selskaper
      summary: Get a company
      description: |
        Returns a company by its ISO 6523 organization identifier, with
        links to its sub-resources: properties, roles, shareholders,
        group structure, financial statements and premises.

        Produktside: [Selskaper](https://docs.placepoint.no/api/selskaper).
      security:
        - oauth2: [companies.read]
      parameters:
        - $ref: "#/components/parameters/scheme"
        - $ref: "#/components/parameters/orgId"
      responses:
        "200":
          description: The company.
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Company" }
              examples:
                norway:
                  summary: Norwegian company
                  value:
                    organizationIdentifier: { scheme: "0192", id: "987654321" }
                    name: Eksempel Eiendom AS
                    country: "NO"
                    status: ACTIVE
                    registeredDate: "2015-03-12"
                    naceCode: "68.209"
                    naceName: Utleie av egen eller leid fast eiendom ellers
                    businessAddress:
                      text: Dronning Eufemias gate 16, 0191 Oslo
                      streetName: Dronning Eufemias gate
                      houseNumber: "16"
                      postalCode: "0191"
                      postalPlace: Oslo
                      country: "NO"
                      cadastreId: 0301-207-76-0-0
                      location: { lat: 59.9075, lon: 10.7563 }
                    postalAddress:
                      text: Postboks 1234 Vika, 0114 Oslo
                      postalCode: "0114"
                      postalPlace: Oslo
                      country: "NO"
                    employees: 12
                    links:
                      - { href: "https://data.placepoint.no/companies/0192/987654321/properties", title: Properties }
                      - { href: "https://data.placepoint.no/companies/0192/987654321/roles", title: Roles }
                      - { href: "https://data.placepoint.no/companies/0192/987654321/shareholders", title: Shareholders }
                sweden:
                  summary: Swedish company
                  value:
                    organizationIdentifier: { scheme: "0007", id: "5566998877" }
                    name: Exempel Fastigheter AB
                    country: "SE"
                    status: ACTIVE
                    registeredDate: "2011-09-20"
                    naceCode: "68.209"
                    naceName: Uthyrning och forvaltning av egna eller arrenderade lokaler
                    businessAddress:
                      text: "Solkraftsvagen 2, 171 41 Solna"
                      streetName: Solkraftsvagen
                      houseNumber: "2"
                      postalCode: "171 41"
                      postalPlace: Solna
                      country: "SE"
                      cadastreId: 0184_svardsliljan_1_1
                      location: { lat: 59.3624, lon: 17.9884 }
                    employees: 8
                    links:
                      - { href: "https://data.placepoint.no/companies/0007/5566998877/properties", title: Properties }
                      - { href: "https://data.placepoint.no/companies/0007/5566998877/roles", title: Roles }
                      - { href: "https://data.placepoint.no/companies/0007/5566998877/shareholders", title: Shareholders }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /companies/{scheme}/{id}/properties:
    get:
      operationId: listCompanyProperties
      tags: [Companies]
      x-placepoint-page: /api/selskaper
      summary: List a company's controlled properties
      description: |
        Lists the properties the company holds a registered ownership
        interest in, directly or through a chain of intermediate entities.
        Each entry carries the ownership share at the property and the
        path of organizations from the queried company down to the
        directly owning entity.

        Produktside: [Selskaper](https://docs.placepoint.no/api/selskaper).
      security:
        - oauth2: [companies.read]
      parameters:
        - $ref: "#/components/parameters/scheme"
        - $ref: "#/components/parameters/orgId"
        - $ref: "#/components/parameters/pageSize"
        - $ref: "#/components/parameters/pageToken"
      responses:
        "200":
          description: Properties controlled by the company.
          content:
            application/json:
              schema:
                type: object
                description: Controlled properties wrapped in an object, cursor-paginated.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per controlled property.
                    items: { $ref: "#/components/schemas/ControlledProperty" }
                  nextPageToken: { type: string, description: Cursor for the next page; absent on the last page. }
              example:
                items:
                  - country: "NO"
                    cadastreId: 0301-207-76-0-0
                    municipality: { code: "0301", name: Oslo }
                    areaM2: 620
                    plotCount: 1
                    propertyType: EIERSEKSJON
                    addresses:
                      - text: Dronning Eufemias gate 16, 0191 Oslo
                        streetName: Dronning Eufemias gate
                        houseNumber: "16"
                        postalCode: "0191"
                        postalPlace: Oslo
                        country: "NO"
                        cadastreId: 0301-207-76-0-0
                        location: { lat: 59.9075, lon: 10.7563 }
                    share: { numerator: 1, denominator: 1 }
                    path:
                      - { scheme: "0192", id: "987654321" }
                nextPageToken: eyJvZmZzZXQiOjF9
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /companies/{scheme}/{id}/employees:
    get:
      operationId: getCompanyEmployees
      tags: [Companies]
      x-placepoint-page: /api/selskaper
      summary: Get a company's employee-count history
      description: |
        Lists the company's registered employee count by month, oldest
        first, from Brønnøysundregistrenes Enhetsregisteret. observed
        distinguishes a confirmed monthly count from an interpolated one.

        Produktside: [Selskaper](https://docs.placepoint.no/api/selskaper).
      security:
        - oauth2: [companies.read]
      parameters:
        - $ref: "#/components/parameters/scheme"
        - $ref: "#/components/parameters/orgId"
      responses:
        "200":
          description: The company's employee-count history.
          content:
            application/json:
              schema:
                type: object
                description: Employee counts wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per month.
                    items: { $ref: "#/components/schemas/EmployeeCount" }
              example:
                items:
                  - period: "2026-07"
                    count: 11
                    observed: true
                  - period: "2026-08"
                    count: 12
                    observed: true
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /companies/{scheme}/{id}/roles:
    get:
      operationId: listCompanyRoles
      tags: [Companies]
      x-placepoint-page: /api/roller
      summary: List a company's registered roles
      description: |
        Lists the roles (styreleder, daglig leder, ...) registered on the
        company in Brønnøysundregistrenes Enhetsregisteret. holder is
        always returned, but a Person holder's name is included only when
        the caller also holds the owners.read scope; without it, name is
        omitted and only birthYear (when known) is returned, matching the
        property owner endpoints.

        Produktside: [Roller](https://docs.placepoint.no/api/roller).
      security:
        - oauth2: [companies.read]
      parameters:
        - $ref: "#/components/parameters/scheme"
        - $ref: "#/components/parameters/orgId"
      responses:
        "200":
          description: Roles registered on the company.
          content:
            application/json:
              schema:
                type: object
                description: Roles wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per role.
                    items: { $ref: "#/components/schemas/Role" }
              example:
                items:
                  - role: CHAIR
                    holder:
                      kind: PERSON
                      person: { birthYear: 1975 }
                    sinceDate: "2019-06-01"
                  - role: CEO
                    holder:
                      kind: PERSON
                      person: { birthYear: 1980 }
                    sinceDate: "2021-01-15"
                  - role: AUDITOR
                    holder:
                      kind: ORGANIZATION
                      organization: { organizationIdentifier: { scheme: "0192", id: "912345678" }, name: Revisor AS, country: "NO" }
                    sinceDate: "2020-03-01"
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /companies/{scheme}/{id}/shareholders:
    get:
      operationId: listCompanyShareholders
      tags: [Companies]
      x-placepoint-page: /api/aksjonaerer
      summary: List a company's shareholders
      description: |
        Lists the entries in the company's aksjonærregister. A Person
        shareholder's name is included only when the caller also holds
        the owners.read scope; without it, name is omitted and only
        birthYear (when known) is returned, matching the property owner
        endpoints. isUltimateBeneficialOwner flags a shareholder recorded
        as a reell rettighetshaver.

        Produktside: [Aksjonærer](https://docs.placepoint.no/api/aksjonaerer).
      security:
        - oauth2: [companies.read]
      parameters:
        - $ref: "#/components/parameters/scheme"
        - $ref: "#/components/parameters/orgId"
      responses:
        "200":
          description: Shareholders of the company.
          content:
            application/json:
              schema:
                type: object
                description: Shareholders wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per shareholder.
                    items: { $ref: "#/components/schemas/Shareholder" }
              example:
                items:
                  - kind: ORGANIZATION
                    organization: { organizationIdentifier: { scheme: "0192", id: "911222333" }, name: Eksempel Holding AS, country: "NO" }
                    share: { numerator: 3, denominator: 4 }
                    registeredAt: "2018-01-10T00:00:00Z"
                    shareClass: A
                    shares: 750
                    isUltimateBeneficialOwner: true
                  - kind: PERSON
                    person: { birthYear: 1968 }
                    share: { numerator: 1, denominator: 4 }
                    registeredAt: "2018-01-10T00:00:00Z"
                    shareClass: A
                    shares: 250
                    isUltimateBeneficialOwner: false
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /companies/{scheme}/{id}/group-structure:
    get:
      operationId: getCompanyGroupStructure
      tags: [Companies]
      x-placepoint-page: /api/konsern
      summary: Get a company's group structure
      description: |
        Returns the company's position in its konsern (group structure):
        its direct parents and subsidiaries, each carrying the ownership
        share and its own parents and subsidiaries, recursively.

        Produktside: [Konsernstruktur](https://docs.placepoint.no/api/konsern).
      security:
        - oauth2: [companies.read]
      parameters:
        - $ref: "#/components/parameters/scheme"
        - $ref: "#/components/parameters/orgId"
      responses:
        "200":
          description: The company's group structure.
          content:
            application/json:
              schema: { $ref: "#/components/schemas/GroupNode" }
              example:
                organization: { organizationIdentifier: { scheme: "0192", id: "987654321" }, name: Eksempel Eiendom AS, country: "NO" }
                parents:
                  - organization: { organizationIdentifier: { scheme: "0192", id: "911000111" }, name: Eksempel Holding AS, country: "NO" }
                    share: { numerator: 1, denominator: 1 }
                    parents: []
                    subsidiaries: []
                subsidiaries:
                  - organization: { organizationIdentifier: { scheme: "0192", id: "922000222" }, name: Eksempel Datter AS, country: "NO" }
                    share: { numerator: 1, denominator: 1 }
                    parents: []
                    subsidiaries: []
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /companies/{scheme}/{id}/financial-statements:
    get:
      operationId: listFinancialStatements
      tags: [Companies]
      x-placepoint-page: /api/regnskap
      summary: List a company's financial statements
      description: |
        Lists the company's filed annual financial statements (regnskap),
        newest first, from Regnskapsregisteret. yoy compares each
        statement to the prior filed year, in percentage points.

        Produktside: [Regnskap](https://docs.placepoint.no/api/regnskap).
      security:
        - oauth2: [companies.read]
      parameters:
        - $ref: "#/components/parameters/scheme"
        - $ref: "#/components/parameters/orgId"
      responses:
        "200":
          description: Financial statements for the company.
          content:
            application/json:
              schema:
                type: object
                description: Financial statements wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per fiscal year, newest first.
                    items: { $ref: "#/components/schemas/FinancialStatement" }
              example:
                items:
                  - year: 2025
                    currency: NOK
                    revenue: { amount: "45000000.00", currency: NOK }
                    operatingResult: { amount: "6200000.00", currency: NOK }
                    netResult: { amount: "4100000.00", currency: NOK }
                    equity: { amount: "18500000.00", currency: NOK }
                    totalAssets: { amount: "92000000.00", currency: NOK }
                    employees: 12
                    operatingResultBeforeDepreciation: { amount: "8100000.00", currency: NOK }
                    liabilities: { amount: "73500000.00", currency: NOK }
                    profitMarginPct: 9.1
                    announcedDate: "2026-05-28"
                    isConsolidated: false
                    yoy: { revenuePct: 5.4, netResultPct: -2.1 }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /companies/{scheme}/{id}/premises:
    get:
      operationId: listCompanyPremises
      tags: [Companies]
      x-placepoint-page: /api/lokaler
      summary: List a company's registered premises
      description: |
        Lists the properties the company has registered as a business
        address (forretningsadresse), current and historical, sourced
        from Brønnøysundregistrenes Enhetsregisteret and refreshed
        nightly. verification has the same shape as a property's tenant
        verification: source states whether the premises is confirmed by
        the register, observed from other signals, or both.

        Produktside: [Lokaler](https://docs.placepoint.no/api/lokaler).
      security:
        - oauth2: [companies.read]
      parameters:
        - $ref: "#/components/parameters/scheme"
        - $ref: "#/components/parameters/orgId"
      responses:
        "200":
          description: Premises registered by the company.
          content:
            application/json:
              schema:
                type: object
                description: Premises wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per registered premises.
                    items: { $ref: "#/components/schemas/Premises" }
              example:
                items:
                  - property:
                      country: "NO"
                      cadastreId: 0301-207-76-0-0
                      municipality: { code: "0301", name: Oslo }
                      areaM2: 620
                      plotCount: 1
                      propertyType: EIERSEKSJON
                    unitNumber: H0301
                    sinceDate: "2019-07-01"
                    verification: { source: ENHETSREGISTERET, confidence: HIGH, lastSeenAt: "2026-08-15T02:00:00Z" }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /companies/{scheme}/{id}/documents:
    get:
      operationId: listCompanyDocuments
      tags: [Companies]
      x-placepoint-page: /api/dokumenter
      summary: List a company's documents
      description: |
        Lists documents filed by or about the company: annual reports,
        articles of association and other filings from its home register.
        Each downloadUrl is a signed URL valid for 15 minutes; request the
        list again for a fresh link once it expires.

        Produktside: [Dokumenter](https://docs.placepoint.no/api/dokumenter).
      security:
        - oauth2: [companies.read]
      parameters:
        - $ref: "#/components/parameters/scheme"
        - $ref: "#/components/parameters/orgId"
      responses:
        "200":
          description: Documents filed by or about the company.
          content:
            application/json:
              schema:
                type: object
                description: Documents wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per document.
                    items: { $ref: "#/components/schemas/Document" }
              example:
                items:
                  - id: doc_91044
                    kind: ANNUAL_REPORT
                    title: Årsrapport 2025 Entra ASA
                    publishedDate: "2026-04-24"
                    downloadUrl: "https://data.placepoint.no/files/doc_91044?sig=cd34ef56ab12&exp=1893456000"
                    mediaType: application/pdf
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /areas/{country}/{areaId}/statistics:
    get:
      operationId: getAreaStatistics
      tags: [Areas]
      x-placepoint-page: /api/omrader
      summary: Get area statistics
      description: |
        Returns aggregate statistics for a kommune, grunnkrets or postal
        code: population, median income, price per square metre and
        recent transaction volume, alongside a qualitative
        market-activity tier.

        Produktside: [Områdestatistikk](https://docs.placepoint.no/api/omrader).
      security:
        - oauth2: [areas.read]
      parameters:
        - $ref: "#/components/parameters/country"
        - $ref: "#/components/parameters/areaId"
      responses:
        "200":
          description: Statistics for the area.
          content:
            application/json:
              schema: { $ref: "#/components/schemas/AreaStatistics" }
              example:
                area: { id: "0301", kind: MUNICIPALITY, name: Oslo }
                population: 717710
                populationByGender: { male: 355200, female: 362510 }
                populationByAgeGroup:
                  - { label: 0-5, count: 44100, sharePct: 6.1 }
                  - { label: 6-15, count: 71800, sharePct: 10 }
                  - { label: 16-66, count: 501300, sharePct: 69.8 }
                  - { label: 67+, count: 100510, sharePct: 14.1 }
                populationByEducationLevel:
                  - { label: Grunnskole, count: 118400, sharePct: 19.4 }
                  - { label: Videregående, count: 197300, sharePct: 32.3 }
                  - { label: Universitet og høyskole, count: 294600, sharePct: 48.3 }
                populationHistory:
                  - { year: 2023, value: 709037 }
                  - { year: 2024, value: 713265 }
                  - { year: 2025, value: 717710 }
                populationProjection:
                  - { year: 2030, value: 748000 }
                  - { year: 2040, value: 792000 }
                averageAge: 38.4
                daytimePopulation: 812400
                commuters: { inbound: 137500, outbound: 61200 }
                households: { count: 371400, averageSize: 1.9, byComposition: [{ label: Enperson, count: 190100, sharePct: 51.2 }, { label: Par med barn, count: 82600, sharePct: 22.2 }] }
                housing:
                  unitCount: 358900
                  cabinCount: 2140
                  averageAreaM2: 74
                  averageBuiltYear: 1968
                  averagePrice: { amount: "6250000.00", currency: NOK }
                  byType:
                    - { label: Blokkleilighet, count: 259400, sharePct: 72.3 }
                    - { label: Enebolig, count: 26800, sharePct: 7.5 }
                employeeCount: 486200
                medianIncome: { amount: "465000.00", currency: NOK }
                totalIncome: { amount: "412000000000.00", currency: NOK }
                averageWealth: { amount: "1840000.00", currency: NOK }
                transactionsLast12Months: 8340
                medianPricePerM2: { amount: "95000.00", currency: NOK }
                marketActivity: HIGH
                priceHistory:
                  - { quarter: 2026-Q1, medianPricePerM2: { amount: "93500.00", currency: NOK }, transactionCount: 1980 }
                  - { quarter: 2026-Q2, medianPricePerM2: { amount: "95000.00", currency: NOK }, transactionCount: 2140 }
                asOfDate: "2026-06-30"
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /areas/{country}/{areaId}/land-allocations:
    get:
      operationId: listLandAllocations
      tags: [Areas]
      x-placepoint-page: /api/markanvisningar
      summary: List land allocation tenders
      description: |
        Lists markanvisningar (land allocation tenders) for the area,
        newest first, sourced from Combify for Sweden. Norway has no
        equivalent public register, so a Norwegian areaId always
        returns an empty list.

        Produktside: [Markanvisningar](https://docs.placepoint.no/api/markanvisningar).
      security:
        - oauth2: [areas.read]
      parameters:
        - name: country
          in: path
          required: true
          description: ISO 3166-1 alpha-2 country code of the cadastre register.
          schema: { type: string, enum: ["NO", "SE"] }
          example: "SE"
        - name: areaId
          in: path
          required: true
          description: "Kommunkod (4 digits) for SE; kommunenummer (4 digits), grunnkrets id (8 digits) or postal code (4 digits) for NO, which always returns an empty list."
          schema: { type: string, maxLength: 20 }
          example: "0180"
        - $ref: "#/components/parameters/pageSize"
        - $ref: "#/components/parameters/pageToken"
      responses:
        "200":
          description: Land allocation tenders for the area.
          content:
            application/json:
              schema:
                type: object
                description: "Land allocation tenders wrapped in an object, cursor-paginated."
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per tender, newest first.
                    items: { $ref: "#/components/schemas/LandAllocation" }
                  nextPageToken: { type: string, description: Cursor for the next page; absent on the last page. }
              example:
                items:
                  - id: markanvisning_2026_014
                    title: "Kvarteret Ekorren, bostäder"
                    municipality: { code: "0180", name: Stockholm }
                    status: OPEN
                    deadlineDate: "2026-11-15"
                    areaM2: 4200
                    documents:
                      - id: doc_55210
                        kind: OTHER
                        title: "Markanvisningstävling, program"
                        publishedDate: "2026-08-01"
                        downloadUrl: "https://data.placepoint.no/files/doc_55210?sig=ab12cd34ef56&exp=1893456000"
                        mediaType: application/pdf
                nextPageToken: eyJvZmZzZXQiOjF9
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /subscriptions:
    post:
      operationId: createSubscription
      tags: [Subscriptions]
      x-placepoint-page: /api/varsler
      summary: Create a subscription
      description: |
        Creates a subscription that delivers change events for one
        property or company as signed CloudEvents 1.0 webhooks.
        Idempotency-Key replays the same response to a retried request
        for 24 hours.

        Each delivery is a CloudEvents 1.0 envelope: specversion "1.0",
        a type like "no.placepoint.property.owner_changed", source
        identifying the subscription, id, time and data holding the
        changed resource. The request carries a Placepoint-Signature
        header shaped `t=<unix-timestamp>,v1=<hex-signature>`, where
        signature is the hex-encoded HMAC-SHA256, keyed on secret, of
        the string formed by joining t and the raw request body with
        a period. The receiver can verify authenticity before
        trusting the payload. A failed delivery
        retries with exponential backoff for up to 24 hours; delivery
        is at-least-once, so a receiver must handle a duplicate event
        by id.

        Produktside: [Varsler](https://docs.placepoint.no/api/varsler).
      security:
        - oauth2: [subscriptions.write]
      parameters:
        - $ref: "#/components/parameters/idempotencyKey"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: A subscription to create.
              required: [target, events, webhookUrl, secret]
              additionalProperties: false
              properties:
                target: { $ref: "#/components/schemas/SubscriptionTarget" }
                events:
                  type: array
                  description: Event types to deliver.
                  minItems: 1
                  items: { type: string, enum: [OWNER_CHANGED, TENANT_CHANGED, TRANSACTION_REGISTERED, BUILDING_PERMIT_CHANGED, ZONING_PLAN_CHANGED] }
                webhookUrl: { type: string, format: uri, pattern: "^https://", description: HTTPS endpoint events are delivered to. }
                secret: { type: string, format: password, writeOnly: true, minLength: 32, description: Shared secret used to sign delivered payloads. Never returned by the API. }
            example:
              target: { kind: PROPERTY, country: "NO", cadastreId: 0301-207-76-0-0 }
              events: [OWNER_CHANGED, TRANSACTION_REGISTERED]
              webhookUrl: "https://example.com/webhooks/placepoint"
              secret: whsec_REPLACE_WITH_32_RANDOM_CHARS
      responses:
        "201":
          description: The created subscription.
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Subscription" }
              example:
                id: sub_9f2c1a
                target: { kind: PROPERTY, country: "NO", cadastreId: 0301-207-76-0-0 }
                events: [OWNER_CHANGED, TRANSACTION_REGISTERED]
                webhookUrl: "https://example.com/webhooks/placepoint"
                status: ACTIVE
                createdAt: "2026-09-07T10:15:00Z"
        "400": { $ref: "#/components/responses/BadRequest" }
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
    get:
      operationId: listSubscriptions
      tags: [Subscriptions]
      x-placepoint-page: /api/varsler
      summary: List subscriptions
      description: |
        Lists the caller's active and paused subscriptions.

        Produktside: [Varsler](https://docs.placepoint.no/api/varsler).
      security:
        - oauth2: [subscriptions.write]
      responses:
        "200":
          description: The caller's subscriptions.
          content:
            application/json:
              schema:
                type: object
                description: Subscriptions wrapped in an object.
                required: [items]
                properties:
                  items:
                    type: array
                    description: One entry per subscription.
                    items: { $ref: "#/components/schemas/Subscription" }
              example:
                items:
                  - id: sub_9f2c1a
                    target: { kind: PROPERTY, country: "NO", cadastreId: 0301-207-76-0-0 }
                    events: [OWNER_CHANGED, TRANSACTION_REGISTERED]
                    webhookUrl: "https://example.com/webhooks/placepoint"
                    status: ACTIVE
                    createdAt: "2026-09-07T10:15:00Z"
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /subscriptions/{subscriptionId}:
    delete:
      operationId: deleteSubscription
      tags: [Subscriptions]
      x-placepoint-page: /api/varsler
      summary: Delete a subscription
      description: |
        Deletes a subscription. Delivery stops immediately and the id cannot be reused.

        Produktside: [Varsler](https://docs.placepoint.no/api/varsler).
      security:
        - oauth2: [subscriptions.write]
      parameters:
        - name: subscriptionId
          in: path
          required: true
          description: The id returned when the subscription was created.
          schema: { type: string }
          example: sub_9f2c1a
      responses:
        "204":
          description: Subscription deleted.
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /auth/token:
    post:
      operationId: createToken
      tags: [Platform]
      summary: Create an access token
      description: |
        Exchanges client credentials for a bearer access token, the
        OAuth 2 client-credentials grant (RFC 6749 section 4.4). The
        request body is application/x-www-form-urlencoded with the
        wire names RFC 6749 mandates (grant_type, client_id,
        client_secret, scope); those four field names, and the
        token-response fields access_token, token_type and
        expires_in, are the platform's only snake_case exception to
        its camelCase convention.

        A failed grant returns 400 with an RFC 6749 section 5.2 error
        body (application/json, not Problem Details): this is the one
        endpoint where the OAuth spec, not api-design/README.md,
        defines the error contract.
      security: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              description: Client-credentials grant per RFC 6749 section 4.4.
              required: [grant_type, client_id, client_secret]
              additionalProperties: false
              properties:
                grant_type: { type: string, enum: [client_credentials], description: Always "client_credentials". }
                client_id: { type: string, description: The client identifier issued at onboarding. }
                client_secret: { type: string, format: password, writeOnly: true, description: The client secret issued at onboarding. Never returned by the API. }
                scope: { type: string, description: "Space-delimited scopes to request; defaults to every scope granted to the client." }
            example:
              grant_type: client_credentials
              client_id: ppk_test_9f2c1a
              client_secret: ppk_test_...
              scope: properties.read companies.read
      responses:
        "200":
          description: The access token.
          content:
            application/json:
              schema: { $ref: "#/components/schemas/TokenResponse" }
              example:
                access_token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
                token_type: Bearer
                expires_in: 3600
                scope: properties.read companies.read
        "400":
          description: "The grant request was rejected, RFC 6749 section 5.2."
          content:
            application/json:
              schema: { $ref: "#/components/schemas/TokenError" }
              example:
                error: invalid_client
                error_description: "Unknown client_id or invalid client_secret."
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
  /auth/me:
    get:
      operationId: getMe
      tags: [Platform]
      summary: Get the caller's identity
      description: |
        Returns the identity, tier and quota usage of the client
        credentials making the request: which scopes are granted, the
        daily call limit, and how many calls have been made so far
        this calendar day, UTC, resets at 00:00 UTC.
      security:
        - oauth2: []
      responses:
        "200":
          description: The caller's identity and quota usage.
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Me" }
              example:
                clientId: ppk_test_9f2c1a
                tier: STANDARD
                scopes: [properties.read, companies.read, areas.read]
                dailyCallLimit: 50000
                callsToday: 1274
        "401": { $ref: "#/components/responses/Unauthorized" }
        "403": { $ref: "#/components/responses/Forbidden" }
        "429": { $ref: "#/components/responses/TooManyRequests" }
        "500": { $ref: "#/components/responses/InternalError" }
components:
  securitySchemes:
    oauth2:
      type: oauth2
      description: Client-credentials grant at /auth/token. Scopes are dot-separated <resource>.<action>.
      flows:
        clientCredentials:
          tokenUrl: https://data.placepoint.no/auth/token
          scopes:
            properties.read: Read properties and their sub-resources.
            companies.read: Read companies and their sub-resources.
            owners.read: Person fields on owners, roles and shareholders (PII tier).
            areas.read: Read area statistics and land allocations.
            subscriptions.write: Create and delete subscriptions.
  parameters:
    country:
      name: country
      in: path
      required: true
      description: ISO 3166-1 alpha-2 country code of the cadastre register.
      schema: { type: string, enum: ["NO", "SE"] }
      example: "NO"
    cadastreId:
      name: cadastreId
      in: path
      required: true
      description: |
        Cadastre identifier in the country's register. Norway is matrikkelnummer
        knr-gnr-bnr[-fnr[-snr]]; Sweden is fastighetsbeteckning slugged.
        Sweden: the fastighetsbeteckning slug as Combify serves it, e.g.
        0184_svardsliljan_1_1.
      schema: { type: string, pattern: "^[0-9A-Za-z_-]+$", maxLength: 64 }
      example: 0301-207-76-0-0
    areaId:
      name: areaId
      in: path
      required: true
      description: "Kommunenummer (4 digits), grunnkrets id (8 digits) or postal code (4 digits) for NO; kommunkod for SE."
      schema: { type: string, maxLength: 20 }
      example: "0301"
    scheme:
      name: scheme
      in: path
      required: true
      description: ISO 6523 ICD code of the organization register. 0192 is Norwegian organisasjonsnummer, 0007 is Swedish organisationsnummer.
      schema: { type: string, enum: ["0192", "0007"] }
      example: "0192"
    orgId:
      name: id
      in: path
      required: true
      description: The register's own identifier, digits only.
      schema: { type: string, pattern: "^[0-9]{9,10}$" }
      example: "987654321"
    pageSize:
      name: pageSize
      in: query
      required: false
      description: Items per page, 1 to 100.
      schema: { type: integer, minimum: 1, maximum: 100, default: 50 }
    pageToken:
      name: pageToken
      in: query
      required: false
      description: Opaque cursor from the previous page's nextPageToken.
      schema: { type: string }
    idempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      description: Client-generated UUID; the same key replays the same response for 24 hours.
      schema: { type: string, format: uuid }
  responses:
    BadRequest:
      description: The request body or a parameter failed validation.
      content:
        application/problem+json:
          schema: { $ref: "#/components/schemas/Problem" }
    Unauthorized:
      description: The bearer token is missing, expired or invalid.
      content:
        application/problem+json:
          schema: { $ref: "#/components/schemas/Problem" }
    Forbidden:
      description: The token lacks the scope this operation needs.
      content:
        application/problem+json:
          schema: { $ref: "#/components/schemas/Problem" }
    NotFound:
      description: No such resource in the served registers.
      content:
        application/problem+json:
          schema: { $ref: "#/components/schemas/Problem" }
    TooManyRequests:
      description: Rate limit or daily quota exceeded; see the RateLimit headers.
      content:
        application/problem+json:
          schema: { $ref: "#/components/schemas/Problem" }
    InternalError:
      description: Something failed on our side; quote traceId to support.
      content:
        application/problem+json:
          schema: { $ref: "#/components/schemas/Problem" }
  schemas:
    Problem:
      type: object
      description: RFC 9457 Problem Details.
      required: [type, title, status]
      properties:
        type: { type: string, format: uri, description: Problem type URI under https://data.placepoint.no/problems/. }
        title: { type: string, description: Short human summary. }
        status: { type: integer, description: HTTP status code. }
        detail: { type: string, description: What went wrong in this instance. }
        instance: { type: string, format: uri, description: The request path. }
        code: { type: string, description: "Canonical error code, SCREAMING_SNAKE." }
        traceId: { type: string, description: Trace id to quote to support. }
    Link:
      type: object
      description: A related resource.
      required: [href]
      properties:
        href: { type: string, format: uri, description: Absolute URL. }
        title: { type: string, description: Human label. }
    Money:
      type: object
      description: An amount with its currency.
      required: [amount, currency]
      properties:
        amount: { type: string, description: 'Decimal string, e.g. "12500000.00".' }
        currency: { type: string, description: "ISO 4217, e.g. NOK or SEK." }
    Share:
      type: object
      description: Exact fraction from the register.
      required: [numerator, denominator]
      properties:
        numerator: { type: integer, description: Numerator. }
        denominator: { type: integer, description: Denominator. }
    OrganizationIdentifier:
      type: object
      description: ISO 6523 scheme plus register id.
      required: [scheme, id]
      properties:
        scheme: { type: string, description: ISO 6523 ICD code. }
        id: { type: string, description: Register identifier. }
    Organization:
      type: object
      description: A legal entity.
      required: [organizationIdentifier, name, country]
      properties:
        organizationIdentifier: { $ref: "#/components/schemas/OrganizationIdentifier" }
        name: { type: string, description: Registered name., x-pii: false }
        country: { type: string, description: ISO 3166-1 alpha-2. }
        links: { type: array, description: Related resources., items: { $ref: "#/components/schemas/Link" } }
    Person:
      type: object
      description: A natural person. Personal data; returned only with the owners.read scope, otherwise name is omitted.
      x-pii: true
      x-pii-category: identity
      properties:
        name: { type: string, description: Full name., x-pii: true, x-pii-category: identity }
        birthYear: { type: integer, description: Year of birth., x-pii: true, x-pii-category: identity }
    Party:
      type: object
      description: A natural person or a legal entity; which nested object is populated follows kind.
      required: [kind]
      properties:
        kind: { type: string, enum: [PERSON, ORGANIZATION], description: Which nested object is populated. }
        person: { $ref: "#/components/schemas/Person" }
        organization: { $ref: "#/components/schemas/Organization" }
    Owner:
      type: object
      description: A rights holder (hjemmelshaver) or shareholder.
      allOf:
        - $ref: "#/components/schemas/Party"
        - type: object
          required: [share]
          properties:
            share: { $ref: "#/components/schemas/Share" }
            registeredAt: { type: string, format: date-time, description: When the register recorded it. }
            interestType: { type: string, description: "The interest the grunnbok records, e.g. Hjemmelshaver or Fester.", x-pii: false }
            contactRole: { type: string, description: "Registered contact role, where the party is recorded as a contact rather than a holder.", x-pii: false }
            untilDate: { type: string, format: date, description: "When the interest ended. Absent means the interest is current, which is the only way to tell a former owner from a present one." }
    Address:
      type: object
      description: A postal address on a property.
      required: [text, country]
      properties:
        text: { type: string, description: One-line address. }
        streetName: { type: string, description: Street., x-pii: false }
        houseNumber: { type: string, description: Number with letter. }
        postalCode: { type: string, description: Postal code. }
        postalPlace: { type: string, description: Postal place. }
        country: { type: string, description: ISO 3166-1 alpha-2. }
        cadastreId: { type: string, description: The property the address belongs to. }
        location: { $ref: "#/components/schemas/Point" }
    Point:
      type: object
      description: WGS84 point.
      required: [lat, lon]
      properties:
        lat: { type: number, description: Latitude. }
        lon: { type: number, description: Longitude. }
    Municipality:
      type: object
      description: A kommune (Norway) or kommun (Sweden).
      properties:
        code: { type: string, description: Kommunenummer (Norway) or kommunkod (Sweden). }
        name: { type: string, description: Name., x-pii: false }
        countyName: { type: string, description: "Fylke (Norway) or län (Sweden) the municipality belongs to.", x-pii: false }
        cityDistrictName: { type: string, description: "Bydel, where the municipality is divided into them.", x-pii: false }
    Property:
      type: object
      description: A cadastral unit with its plots and addresses.
      required: [country, cadastreId]
      properties:
        country: { type: string, description: ISO 3166-1 alpha-2. }
        cadastreId: { type: string, description: Cadastre identifier. }
        municipality: { $ref: "#/components/schemas/Municipality" }
        areaM2: { type: number, description: Registered plot area in square meters. }
        plotCount: { type: integer, description: Number of teiger. }
        buildingCount: { type: integer, description: Buildings registered on the property. }
        sectionCount: { type: integer, description: Eierseksjoner registered on the property. }
        unitCount: { type: integer, description: Bruksenheter across the buildings. }
        housingUnitCount: { type: integer, description: Dwelling units across the buildings. }
        totalUsableAreaM2: { type: number, description: "Usable floor area (bruksareal) summed over the buildings, in square meters." }
        totalGrossAreaM2: { type: number, description: "Gross floor area (bruttoareal) summed over the buildings, in square meters." }
        builtOverAreaM2: { type: number, description: "Built-over area (bebygd areal, BYA) in square meters." }
        builtOverAreaPct: { type: number, description: Built-over area as a percentage of the plot area. }
        averageFloors: { type: number, description: Average floor count across the buildings. }
        taxationValue: { $ref: "#/components/schemas/Money" }
        establishedDate: { type: string, format: date, description: When the cadastral unit was established in the register. }
        location: { $ref: "#/components/schemas/Point" }
        addresses: { type: array, description: Addresses on the property., items: { $ref: "#/components/schemas/Address" } }
        propertyType: { type: string, enum: [GRUNNEIENDOM, FESTEGRUNN, EIERSEKSJON, ANLEGGSEIENDOM, JORDSAMEIE, FASTIGHET], description: Register type. }
        facilityType:
          type: object
          description: "Registered facility type (formål) for the cadastral unit."
          properties:
            code: { type: string, description: Register code. }
            name: { type: string, description: Type name., x-pii: false }
            description: { type: string, description: What the type covers. }
        purposeType:
          type: object
          description: "Registered purpose (bruksnavn/formål) for the cadastral unit."
          properties:
            code: { type: string, description: Register code. }
            name: { type: string, description: Purpose name., x-pii: false }
            description: { type: string, description: What the purpose covers. }
        otherUnitTypeCode: { type: string, description: "Register code for a unit type that is none of the standard property types." }
        landRegistryName: { type: string, description: "Name the grunnbok carries for the unit, where it differs from the address.", x-pii: false }
        landUse: { type: string, x-extensible-enum: [DEVELOPED, TRANSPORT, CULTIVATED_LAND, PASTURE, FOREST, MIRE, OPEN_FIRM_GROUND, FRESHWATER, SEA, GLACIER, NOT_MAPPED, OTHER], description: "Dominant AR5 land-use class over the property's teiger. The set follows AR5 and grows; treat an unknown value as OTHER." }
        leaseholdCount: { type: integer, description: "Active leasehold plots (festetomter) on the property." }
        hasParkingGarage: { type: boolean, description: Whether a parking garage is registered on the property. }
        historicalReportedAreaM2: { type: number, description: "Previously reported plot area in square meters, where the register has revised it." }
        historicalReportedAreaSourceCode: { type: string, description: Register code for where the historical area came from. }
        tenantSummary:
          type: object
          description: "Companies with a registered business address on the property, counted so a client does not have to page every tenant. The tenants themselves are on listPropertyTenants."
          properties:
            companyCount: { type: integer, description: Companies registered at the property. }
            companiesWithEmployeesCount: { type: integer, description: "Of those, how many report at least one employee." }
            employeeCount: { type: integer, description: Employees summed over those companies. }
        supplements:
          type: object
          description: "Matrikkel supplement flags (opplysninger) on the cadastral unit. Each is registered by the kommune; an absent flag means the register says nothing, not that the condition is false."
          properties:
            hasGroundPollution: { type: boolean, description: Ground pollution is registered on the unit. }
            hasCulturalHeritage: { type: boolean, description: A cultural-heritage interest is registered on the unit. }
            hasNotedComplaint: { type: boolean, description: A complaint (klage) is noted on the unit. }
            hasActiveLeaseholdPlots: { type: boolean, description: The unit has active leasehold plots. }
            hasAgreementBoundaryPointLease: { type: boolean, description: An agreement on boundary or point lease is registered. }
            hasAgreementSiteSpecificRight: { type: boolean, description: A site-specific right is registered by agreement. }
            pointLease: { type: boolean, description: The unit is a point lease (punktfeste). }
            clarifiedOwners: { type: boolean, description: Ownership has been clarified. }
            clarifiedShares: { type: boolean, description: Ownership shares have been clarified. }
            sectioned: { type: boolean, description: The unit is divided into eierseksjoner. }
            additionalArea: { type: boolean, description: Additional area (tilleggsareal) is registered. }
            newlyRegistered: { type: boolean, description: The unit was recently registered. }
            discontinued: { type: boolean, description: The unit has been discontinued (utgått). }
            underMergerRemains: { type: boolean, description: The unit remains after a merger (sammenslåing). }
            underMergerExpires: { type: boolean, description: The unit expires through a merger. }
            partOfConsolidatedRealEstate: { type: boolean, description: The unit is part of a consolidated property. }
            createdOnASeparateBasis: { type: boolean, description: The unit was created on a separate basis. }
            landAcquisitionRegistered: { type: boolean, description: A land acquisition is registered. }
            landPartitioningRequiredRegistered: { type: boolean, description: Required land partitioning is registered. }
            measurementNotCompleted: { type: boolean, description: Surveying of the unit is not completed. }
            borderPointMarkingIsMissing: { type: boolean, description: Boundary-point marking is missing. }
            cadastralRecordingDeficiency: { type: boolean, description: A deficiency in the cadastral recording is registered. }
            registryOfDeeds: { type: boolean, description: The unit is recorded in the older registry of deeds (grunnboksblad). }
        links: { type: array, description: Sub-resources., items: { $ref: "#/components/schemas/Link" } }
    Building:
      type: object
      description: A building (bygning) registered on a property.
      required: [buildingNumber, status]
      properties:
        buildingNumber: { type: string, description: Bygningsnummer within the property. }
        buildingType:
          type: object
          description: Registered building type.
          properties:
            code: { type: string, description: "Register type code, e.g. \"141\"." }
            name: { type: string, description: "Type name, e.g. Boligblokk.", x-pii: false }
            primaryCode: { type: string, description: "Primary type code, the first level of the register's own two-level classification." }
            subCode: { type: string, description: Sub-type code within the primary code. }
        status: { type: string, enum: [PLANNED, UNDER_CONSTRUCTION, IN_USE, DEMOLISHED], description: Construction status. }
        builtYear: { type: integer, description: Year the building was completed. }
        floors: { type: integer, description: Number of floors. }
        grossAreaM2: { type: number, description: Gross floor area (bruttoareal) in square meters. }
        usableAreaM2: { type: number, description: Usable floor area (bruksareal) in square meters. }
        footprintM2: { type: number, description: Ground footprint in square meters. }
        residentialUsableAreaM2: { type: number, description: "Usable floor area used for housing, in square meters." }
        otherUsableAreaM2: { type: number, description: "Usable floor area used for anything but housing, in square meters." }
        builtOverAreaM2: { type: number, description: "Built-over area (bebygd areal, BYA) in square meters." }
        builtOverAreaPct: { type: number, description: Built-over area as a percentage of the plot area. }
        dwellingUnitCount: { type: integer, description: Dwelling units in the building. }
        hasLift: { type: boolean, description: Whether the building is registered with a lift. }
        waterSupply: { type: string, enum: [PUBLIC, PRIVATE_SHARED, PRIVATE_SINGLE, NONE, UNKNOWN], description: Registered water supply. }
        sewerage: { type: string, enum: [PUBLIC, PRIVATE_SHARED, PRIVATE_SINGLE, NONE, UNKNOWN], description: Registered sewerage. }
        energySources: { type: array, description: Registered energy sources., items: { type: string, enum: [ELECTRICITY, DISTRICT_HEATING, OIL, GAS, BIOFUEL, SOLAR, HEAT_PUMP, OTHER] } }
        heatingTypes: { type: array, description: Registered heating types., items: { type: string, enum: [ELECTRIC, CENTRAL, HEAT_PUMP, RADIATOR, UNDERFLOOR, STOVE, OTHER] } }
        usageGroup: { type: string, enum: [RESIDENTIAL, COMMERCIAL, HOLIDAY, AGRICULTURAL, OTHER], description: Industry group the registered building type belongs to. }
        registrationOrigin: { type: string, enum: [ORDINARY_REGISTRATION, HISTORICAL, OTHER], description: How the building entered the register. }
        isCulturalHeritage: { type: boolean, description: Whether the building is registered as a cultural heritage site. }
        isSefrakRegistered: { type: boolean, description: "Whether the building is in SEFRAK, the register of buildings from before 1900." }
        sequenceNumber: { type: integer, description: "The building's sequence number (løpenummer) within the property." }
        extensionTypeCode: { type: string, description: "Register code for an extension (tilbygg) relationship to another building." }
        isAreaIncomplete: { type: boolean, description: "Whether the register itself flags the area figures as incomplete. When true, a zero or absent area means unmeasured rather than nothing built." }
        isWithoutBuiltUpArea: { type: boolean, description: Whether the building is registered as having no built-up area. }
        hasSprinklerSystem: { type: boolean, description: "Whether the building is registered with an automatic fire-suppression system. Absent means no source covers the building, not that it has none." }
        derivedUsage: { type: string, x-extensible-enum: [OFFICE, RESIDENTIAL, RETAIL, HOSPITAL, INDUSTRIAL, LOGISTICS, HOTEL, EDUCATION, OTHER], description: "What Placepoint's classifier reads the building as, from footprint, height and surroundings. Derived, not registered: buildingType is what the register says, and the two disagree most often on older commercial stock. The set grows; treat an unknown value as OTHER." }
        elevation: { $ref: "#/components/schemas/BuildingElevation" }
        statusHistory: { type: array, description: "Registered status changes, oldest first.", items: { $ref: "#/components/schemas/BuildingStatusChange" } }
        floorDetails: { type: array, description: "Registered floors, lowest first. floors carries the count.", items: { $ref: "#/components/schemas/Floor" } }
        location: { $ref: "#/components/schemas/Point" }
    BuildingElevation:
      type: object
      description: Measured heights for a building, in meters.
      properties:
        baseElevationM: { type: number, description: "Ground elevation at the building, in meters above sea level." }
        highestPointM: { type: number, description: "Highest measured point of the building, in meters above sea level." }
        heightAboveGroundM: { type: number, description: "Building height above ground, in meters." }
    BuildingStatusChange:
      type: object
      description: One registered change of a building's construction status.
      required: [status]
      properties:
        status: { type: string, enum: [PLANNED, UNDER_CONSTRUCTION, IN_USE, DEMOLISHED], description: The status the building changed to. }
        changedDate: { type: string, format: date, description: When the change took effect. }
        registeredDate: { type: string, format: date, description: When the register recorded the change. }
        reason: { type: string, description: "Registered reason for the change, e.g. Ferdigattest." }
    Floor:
      type: object
      description: One registered floor in a building.
      required: [floorNumber]
      properties:
        floorNumber: { type: integer, description: "Floor number, negative below ground." }
        floorKind: { type: string, enum: [BASEMENT, UNDERGROUND, GROUND, MAIN, ATTIC], description: Registered floor kind. }
        usableAreaM2: { type: number, description: "Usable floor area on the floor, in square meters." }
        roomCount: { type: integer, description: Rooms on the floor. }
        dwellingUnitCount: { type: integer, description: Dwelling units on the floor. }
    Unit:
      type: object
      description: A residential or commercial unit (bruksenhet) within a building.
      required: [unitNumber, buildingNumber]
      properties:
        unitNumber: { type: string, description: "Bruksenhetsnummer, e.g. H0301." }
        buildingNumber: { type: string, description: The building the unit belongs to. }
        floor: { type: integer, description: Floor number. }
        usableAreaM2: { type: number, description: Usable area in square meters. }
        useType: { type: string, enum: [BOLIG, NAERING, GARASJE, ANNET], description: Registered use of the unit. }
        cadastreId: { type: string, description: "The unit's own matrikkelnummer, where it is registered as a section." }
        grossAreaM2: { type: number, description: Gross area in square meters. }
        primaryRoomAreaM2: { type: number, description: "Primary room area (P-ROM) in square meters." }
        roomCount: { type: integer, description: Rooms in the unit. }
        bathroomCount: { type: integer, description: Bathrooms in the unit. }
        toiletCount: { type: integer, description: Toilets in the unit. }
        kitchenAccess: { type: string, enum: [OWN_KITCHEN, SHARED_KITCHEN, NO_KITCHEN, UNKNOWN], description: Registered kitchen access. }
        ownershipForm: { type: string, enum: [FREEHOLD, HOUSING_COOPERATIVE, SHARE_APARTMENT, RENTAL, UNKNOWN], description: How the unit is owned. }
        energyLabel: { type: string, enum: [A, B, C, D, E, F, G], description: "Energy label for the unit, where an energiattest exists." }
        toBeDecommissioned: { type: boolean, description: Whether the register has flagged the unit to be removed. }
        bedroomCount: { type: integer, description: "Bedrooms in the unit, where roomCount counts all rooms." }
        animalsAllowed: { type: boolean, description: Whether the cooperative or association permits pets. }
        cooperativeShareNumber: { type: string, description: "The unit's share number (andelsnummer) in its housing cooperative." }
        address: { $ref: "#/components/schemas/Address" }
    Section:
      type: object
      description: An eierseksjon (ownership section) of a property, with its ownership share and owners.
      required: [sectionNumber, cadastreId, share, useType]
      properties:
        sectionNumber: { type: string, description: Seksjonsnummer within the property. }
        cadastreId: { type: string, description: The property the section belongs to. }
        share: { $ref: "#/components/schemas/Share" }
        owners: { type: array, description: "Rights holders. A Person owner's name is included only with the owners.read scope; otherwise it is omitted.", items: { $ref: "#/components/schemas/Owner" } }
        useType: { type: string, enum: [BOLIG, NAERING, GARASJE, ANNET], description: Registered use of the section. }
    Verification:
      type: object
      description: How confident Placepoint is that a tenancy or premises registration still holds.
      properties:
        source: { type: string, enum: [ENHETSREGISTERET, BOLAGSVERKET, OBSERVED, BOTH], description: "Where the signal comes from: ENHETSREGISTERET for Norway, BOLAGSVERKET for Sweden, OBSERVED or BOTH when corroborated by other signals." }
        confidence: { type: string, enum: [HIGH, MEDIUM, LOW], description: Confidence in the tenancy. }
        lastSeenAt: { type: string, format: date-time, description: When the signal was last confirmed. }
    Tenant:
      type: object
      description: A company with a registered business address on the property, from Enhetsregisteret.
      required: [organization]
      properties:
        organization: { $ref: "#/components/schemas/Organization" }
        verification: { $ref: "#/components/schemas/Verification" }
        employees: { type: integer, description: Registered number of employees. }
        naceCode: { type: string, description: "NACE industry code, e.g. 70.220." }
        naceName: { type: string, description: NACE industry name., x-pii: false }
        unitNumber: { type: string, description: "The unit the tenant occupies, when known." }
        legalForm: { type: string, description: "Registered legal form, e.g. Aksjeselskap." }
        foundedDate: { type: string, format: date, description: When the company was founded. }
        movedInDate: { type: string, format: date, description: When the company registered this address. }
        ceo: { $ref: "#/components/schemas/Person" }
        website: { type: string, format: uri, description: Registered website. }
        phone: { type: string, description: Registered phone number., x-pii: true, x-pii-category: contact }
        isOwner: { type: boolean, description: Whether the company also holds a registered ownership interest in the property. }
    Transaction:

      type: object
      description: A recorded sale of the property or a share of it.
      required: [id, registeredAt, kind, source]
      properties:
        id: { type: string, description: Transaction identifier. }
        registeredAt: { type: string, format: date-time, description: When the transaction was recorded (tinglyst). }
        kind: { type: string, enum: [SALE, GIFT, INHERITANCE, MERGER, OTHER], description: Transaction type. }
        price: { $ref: "#/components/schemas/Money" }
        share: { $ref: "#/components/schemas/Share" }
        buyers: { type: array, description: "Buyers. A Person buyer's name is included only with the owners.read scope.", items: { $ref: "#/components/schemas/Owner" } }
        sellers: { type: array, description: "Sellers. A Person seller's name is included only with the owners.read scope.", items: { $ref: "#/components/schemas/Owner" } }
        source: { type: string, enum: [KARTVERKET_TINGLYSING, LANTMATERIET], description: "Register behind the transaction: KARTVERKET_TINGLYSING for Norway, LANTMATERIET for Sweden." }
        sectionNumber: { type: string, description: "The section transferred, where the transaction covers one eierseksjon." }
        documentNumber: { type: string, description: Document number in the register. }
        documentYear: { type: integer, description: Document year in the register. }
        transferTax: { $ref: "#/components/schemas/Money" }
        registrationFee: { $ref: "#/components/schemas/Money" }
        advertisedOnOpenMarket: { type: boolean, description: Whether the register records the sale as advertised on the open market. }
        instrumentType: { type: string, description: "The legal instrument behind the transfer, e.g. Skjøte. Narrower than kind, which groups instruments into transaction types." }
        documentStatusCode: { type: string, description: Register status code for the document. }
        transferTaxBasis: { $ref: "#/components/schemas/Money" }
        transferTaxReason: { type: string, description: "Registered reason for the transfer-tax treatment, e.g. an exemption." }
        isHistorical: { type: boolean, description: Whether the entry has been superseded by a later registration. }
    ComparableTransaction:
      type: object
      description: A comparable transaction, a Transaction plus how it compares to the subject property.
      allOf:
        - $ref: "#/components/schemas/Transaction"
        - type: object
          required: [distanceM, pricePerM2, similarity]
          properties:
            distanceM: { type: number, description: Distance from the subject property in meters. }
            pricePerM2: { $ref: "#/components/schemas/Money" }
            similarity: { type: number, minimum: 0, maximum: 1, description: "Similarity score, 0 to 1." }
    Valuation:
      type: object
      description: The current estimated value and rent for a property.
      required: [value, valuedAt]
      properties:
        value:
          type: object
          description: Estimated sale value.
          properties:
            estimate: { $ref: "#/components/schemas/Money" }
            low: { $ref: "#/components/schemas/Money" }
            high: { $ref: "#/components/schemas/Money" }
        rent:
          type: object
          description: Estimated rent, when the property type supports a rent estimate.
          properties:
            estimatePerM2Year: { $ref: "#/components/schemas/Money" }
            low: { $ref: "#/components/schemas/Money" }
            high: { $ref: "#/components/schemas/Money" }
        modelEstimates:
          type: array
          description: "The individual model outputs behind the headline estimate. value carries the ensemble Placepoint stands behind; these say how it was reached and how much the models disagree."
          items:
            type: object
            required: [model]
            properties:
              model: { type: string, x-extensible-enum: [INDEX, COMPARABLES, ENSEMBLE, RENTAL_ENSEMBLE, RENTAL_REGRESSION], description: "Which model produced the figure. The set grows as models are added; treat an unknown value as one we do not document yet." }
              estimate: { $ref: "#/components/schemas/Money" }
              low: { $ref: "#/components/schemas/Money" }
              high: { $ref: "#/components/schemas/Money" }
        method: { type: string, description: "Valuation method, e.g. AVM or MANUAL." }
        valuedAt: { type: string, format: date-time, description: When the valuation was computed. }
    EnergyCertificate:
      type: object
      description: An energiattest for a building on the property, from Enova.
      required: [buildingNumber, label, issuedDate, source]
      properties:
        buildingNumber: { type: string, description: The building the certificate covers. }
        label: { type: string, enum: [A, B, C, D, E, F, G], description: "Energy label, A best to G worst." }
        heatingGrade: { type: string, enum: [GREEN, LIGHT_GREEN, YELLOW, ORANGE, RED], description: Heating-source color grade. }
        issuedDate: { type: string, format: date, description: When the certificate was issued. }
        validToDate: { type: string, format: date, description: When the certificate expires. }
        source: { type: string, enum: [ENOVA, BOVERKET], description: "Leverandør behind the certificate: ENOVA for Norway, BOVERKET for Sweden." }
        certificateNumber: { type: string, description: Certificate number in the source register. }
        unitNumber: { type: string, description: "The unit the certificate covers, where it covers one bruksenhet." }
        buildingCategory: { type: string, description: "Registered building category, e.g. Boligblokk." }
        buildingAreaM2: { type: number, description: "The area the certificate was calculated for, in square meters." }
        deliveredEnergyKwhM2: { type: number, description: "Calculated delivered energy per square meter per year, in kWh." }
        documentUrl: { type: string, format: uri, description: "Signed URL to the certificate PDF, valid for 15 minutes." }
    Certification:
      type: object
      description: An environmental certification held by a building on the property.
      required: [scheme, certifiedDate]
      properties:
        scheme: { type: string, x-extensible-enum: [BREEAM_NOR, BREEAM_IN_USE, LEED, SVANEMERKET, TEK10, TEK17], description: "Certification scheme. The set grows as new schemes are added; treat an unknown value as one we do not document yet." }
        rating: { type: string, description: "Rating within the scheme, e.g. Very Good." }
        certifiedDate: { type: string, format: date, description: When the certification was awarded. }
        certifiedAreaM2: { type: number, description: Certified area in square meters. }
        validToDate: { type: string, format: date, description: When the certification expires. }
        certificateNumber: { type: string, description: "Licence or certificate number in the scheme's own register." }
        buildingNumber: { type: string, description: The building the certification covers. }
    ZoningPlan:

      type: object
      description: A reguleringsplan covering the property.
      required: [planId, status]
      properties:
        planId: { type: string, description: Plan identifier in the planregister. }
        name: { type: string, description: Plan name., x-pii: false }
        status: { type: string, enum: [PROPOSED, ADOPTED, REPEALED], description: Plan status. }
        purpose: { type: string, description: "Permitted purpose, e.g. Bolig og forretning." }
        adoptedDate: { type: string, format: date, description: When the plan was adopted. }
        planType: { type: string, x-extensible-enum: [MUNICIPAL_MASTER_PLAN, MUNICIPAL_MASTER_PLAN_PROPOSAL, AREA_ZONING_PLAN, DETAILED_ZONING_PLAN, AREA_DEVELOPMENT_PLAN, PLANNING_PROGRAM, DETALJPLAN, OTHER], description: "Which level of plan this is. AREA_DEVELOPMENT_PLAN is a VPOR and PLANNING_PROGRAM a planprogram; both bind development without being reguleringsplaner. The set grows as municipalities digitize more plan kinds; treat an unknown value as OTHER." }
        verticalLevel: { type: string, description: "Vertical level the plan applies to, e.g. På grunnen." }
        utilizationValue: { type: number, description: Utilization figure the plan sets for the area. }
        inEffectDate: { type: string, format: date, description: When the plan came into effect. }
        considerationZones: { type: array, description: "Hensynssoner covering the property, from the plan.", items: { $ref: "#/components/schemas/ConsiderationZone" } }
        proposedBy: { type: string, description: "Who proposed the plan, e.g. Privat or Kommunen.", x-pii: false }
        finalizedDate: { type: string, format: date, description: "When the plan was finalized (vedtatt sluttbehandlet), where that differs from adoptedDate." }
        minUtilizationValue: { type: number, description: "Minimum utilization the plan requires, where it sets one. utilizationValue carries the maximum." }
        landUseStatus: { type: string, description: "Registered arealbruksstatus for the plan area.", x-pii: false }
        ownershipForm: { type: string, description: "Registered eierform for the plan area.", x-pii: false }
        firstDigitizedDate: { type: string, format: date, description: When the plan was first digitized into the planregister. }
        planUrl: { type: string, format: uri, description: The plan in the municipality's own planregister. }
        municipality: { $ref: "#/components/schemas/Municipality" }
        documents: { type: array, description: Planning documents., items: { $ref: "#/components/schemas/Document" } }
    ConsiderationZone:
      type: object
      description: A hensynssone from a zoning plan, marking something that constrains what may be built.
      required: [name]
      properties:
        code: { type: string, description: Zone code in the planregister. }
        name: { type: string, description: Zone name., x-pii: false }
        description: { type: string, description: What the zone restricts. }
    Utilization:

      type: object
      description: Permitted and built utilization (utnyttelsesgrad) for the property under its zoning plan.
      required: [allowedBraM2, builtBraM2, remainingBraM2]
      properties:
        allowedBya: { type: number, description: Allowed built-over percentage of plot area (bebygd areal). }
        builtBya: { type: number, description: "Built-over percentage of plot area today, computed from the registered buildings." }
        allowedBraM2: { type: number, description: Allowed gross floor area in square meters. }
        builtBraM2: { type: number, description: Built gross floor area in square meters. }
        remainingBraM2: { type: number, description: Remaining allowed gross floor area in square meters. }
        utilizationType: { type: string, x-extensible-enum: [PCT_BYA, PCT_BRA, BRA_PER_PLOT_M2, OTHER], description: "Which figure the plan sets, since a plan states one of them rather than all: percentage of built-over area, percentage of gross floor area, or gross floor area per square meter of plot." }
        minUtilizationValue: { type: number, description: "Minimum utilization the plan requires, where it sets one." }
        basis: { type: string, description: "What the figures rest on, e.g. the applicable zoning plan." }
    BuildingPermit:
      type: object
      description: A building-permit case for the property. Norway is the kommune case archives Placepoint holds; Sweden is bygglov via Combify.
      required: [caseNumber, status]
      properties:
        caseNumber: { type: string, description: Case number in the source archive. }
        kind: { type: string, description: "Case type, e.g. Bruksendring." }
        status: { type: string, enum: [RECEIVED, IN_PROGRESS, APPROVED, REJECTED, CLOSED], description: Case status. }
        receivedDate: { type: string, format: date, description: When the case was received. }
        decidedDate: { type: string, format: date, description: When the case was decided. }
        title: { type: string, description: Case title. }
        documents: { type: array, description: Case documents., items: { $ref: "#/components/schemas/Document" } }
    Encumbrance:
      type: object
      description: A heftelse (encumbrance) registered on the property.
      required: [kind, registeredAt]
      properties:
        kind: { type: string, enum: [MORTGAGE, EASEMENT, RESTRAINT, OTHER], description: Encumbrance type. }
        securedAmount: { $ref: "#/components/schemas/Money" }
        creditor: { $ref: "#/components/schemas/Organization" }
        registeredAt: { type: string, format: date-time, description: When the register recorded it. }
        documentNumber: { type: string, description: Document number in the register. }
    Risk:
      type: object
      description: Assessed natural-hazard risk for the property.
      required: [flood, landslide, quickClay, radon]
      properties:
        flood: { $ref: "#/components/schemas/RiskLevel" }
        landslide: { $ref: "#/components/schemas/RiskLevel" }
        quickClay: { $ref: "#/components/schemas/RiskLevel" }
        radon: { $ref: "#/components/schemas/RiskLevel" }
        stormSurge: { $ref: "#/components/schemas/RiskLevel" }
        contaminatedSoil: { $ref: "#/components/schemas/RiskLevel" }
    RiskLevel:
      type: object
      description: One hazard's assessed level, with its source register.
      required: [level]
      properties:
        level: { type: string, enum: [NONE, LOW, MEDIUM, HIGH, UNKNOWN], description: "Assessed level. UNKNOWN means the register does not yet cover the property, not that it is risk-free." }
        source: { type: string, description: "Leverandør behind the assessment, e.g. NVE or DSA." }
        note: { type: string, description: Short free-text note from the source register. }
    HousingCooperative:
      type: object
      description: The borettslag, sameie or aksjelag the property's unit belongs to.
      required: [organization, kind]
      properties:
        organization: { $ref: "#/components/schemas/Organization" }
        kind: { type: string, enum: [BORETTSLAG, SAMEIE, AKSJELAG, BOSTADSRATTSFORENING], description: Legal form. }
        unitCount: { type: integer, description: Number of units in the cooperative. }
        sharedDebt: { $ref: "#/components/schemas/Money" }
        latestStatement: { $ref: "#/components/schemas/FinancialStatement" }
        units: { type: array, description: "The property's units that belong to the cooperative.", items: { type: string } }
        documents: { type: array, description: "Cooperative documents: annual accounts, articles of association and similar.", items: { $ref: "#/components/schemas/Document" } }
    Document:
      type: object
      description: A document tied to a property, plan, case or tender.
      required: [id, kind, title]
      properties:
        id: { type: string, description: Document identifier. }
        kind: { type: string, x-extensible-enum: [ZONING_PLAN, BUILDING_CASE, SALES_PROSPECTUS, ANNUAL_REPORT, ARTICLES_OF_ASSOCIATION, OTHER], description: "Document category. The set grows as new archives are connected; treat an unknown value as OTHER." }
        title: { type: string, description: Document title. }
        publishedDate: { type: string, format: date, description: When the document was published. }
        downloadUrl: { type: string, format: uri, description: "Signed download URL, valid for 15 minutes." }
        mediaType: { type: string, description: "IANA media type, e.g. application/pdf." }
    GeoJsonFeature:
      type: object
      description: A GeoJSON Feature (RFC 7946) carrying a property boundary or building footprint.
      required: [type, geometry]
      properties:
        type: { type: string, enum: [Feature], description: Always "Feature". }
        geometry: { type: object, description: GeoJSON geometry object. }
        properties:
          type: object
          description: "Feature properties. A building footprint carries heightM (number, meters) and floors (integer); a property boundary leaves this empty."
    Company:
      type: object
      description: A registered business, extending Organization with company-specific fields.
      allOf:
        - $ref: "#/components/schemas/Organization"
        - type: object
          required: [status]
          properties:
            status: { type: string, enum: [ACTIVE, DISSOLVED, BANKRUPT, UNDER_LIQUIDATION], description: Registered company status. }
            registeredDate: { type: string, format: date, description: Date the company was registered in its home register. }
            naceCode: { type: string, description: "NACE industry code, e.g. 68.209." }
            naceName: { type: string, description: NACE industry name., x-pii: false }
            businessAddress: { $ref: "#/components/schemas/Address", x-pii: true, x-pii-category: location }
            postalAddress: { $ref: "#/components/schemas/Address", x-pii: true, x-pii-category: location }
            employees: { type: integer, description: Registered number of employees. }
            employeesDate: { type: string, format: date, description: When the employee count was last confirmed by the register. }
            legalForm: { type: string, description: "Registered legal form, e.g. Aksjeselskap." }
            lei: { type: string, description: "Legal Entity Identifier, where the company has one." }
            marketName: { type: string, description: "Trading name, where it differs from the registered name.", x-pii: false }
            foundedDate: { type: string, format: date, description: When the company was founded. }
            businessActivity: { type: string, description: Registered description of what the company does. }
            ceo: { $ref: "#/components/schemas/Person" }
            website: { type: string, format: uri, description: Registered website. }
            email: { type: string, description: Registered e-mail address., x-pii: true, x-pii-category: contact }
            phone: { type: string, description: Registered phone number., x-pii: true, x-pii-category: contact }
            bankruptDate: { type: string, format: date, description: When bankruptcy proceedings were registered. }
            liquidationDate: { type: string, format: date, description: When liquidation was registered. }
            dissolutionDate: { type: string, format: date, description: When the company was dissolved. }
            naceCodeSecondary: { type: string, description: "Second NACE industry code, where the company registers more than one." }
            naceCodeTertiary: { type: string, description: Third NACE industry code. }
            mobile: { type: string, description: "Registered mobile number, where it differs from phone.", x-pii: true, x-pii-category: contact }
            articlesApprovedDate: { type: string, format: date, description: When the company's articles of association were last approved. }
            accountingYear: { type: integer, description: The accounting year the register holds as current for the company. }
            compulsoryLiquidationDate: { type: string, format: date, description: "When compulsory liquidation (tvangsavvikling) was registered, which is a different event from a voluntary liquidation." }
            subUnits: { type: array, description: "Registered sub-units (underenheter). A tenant in a building is often a sub-unit rather than the parent legal entity.", items: { $ref: "#/components/schemas/Organization" } }
            documents: { type: array, description: "Company documents: annual reports and other filings.", items: { $ref: "#/components/schemas/Document" } }
    ControlledProperty:

      type: object
      description: A property the company holds a registered ownership interest in, directly or through a chain of intermediate entities.
      allOf:
        - $ref: "#/components/schemas/Property"
        - type: object
          required: [share, path]
          properties:
            share: { $ref: "#/components/schemas/Share" }
            path:
              type: array
              description: The ownership chain from the queried company down to the owning entity.
              items: { $ref: "#/components/schemas/OrganizationIdentifier" }
    Role:
      type: object
      description: A registered role (styreleder, daglig leder, ...) held in a company, from Brønnøysundregistrenes Enhetsregisteret.
      required: [role, holder]
      properties:
        role: { type: string, enum: [CHAIR, BOARD_MEMBER, DEPUTY, CEO, AUDITOR, ACCOUNTANT, SIGNATORY], description: Role type. }
        holder: { $ref: "#/components/schemas/Party" }
        sinceDate: { type: string, format: date, description: Date the role began. }
    Shareholder:
      type: object
      description: A shareholder entry in a company's aksjonærregister.
      allOf:
        - $ref: "#/components/schemas/Owner"
        - type: object
          required: [shares, isUltimateBeneficialOwner]
          properties:
            shareClass: { type: string, description: "Share class, e.g. A or B." }
            shares: { type: integer, description: Number of shares held. }
            isUltimateBeneficialOwner: { type: boolean, description: Whether the shareholder is recorded as a reell rettighetshaver. }
            fiscalYear: { type: integer, description: The aksjonærregister year the entry is taken from. }
            sourceDate: { type: string, format: date, description: When the register data was collected. }

    GroupNode:
      type: object
      description: One node (parent, subsidiary or branch) in a company group structure, recursively describing the chain of ownership.
      required: [organization]
      properties:
        organization: { $ref: "#/components/schemas/Organization" }
        share: { $ref: "#/components/schemas/Share" }
        parents: { type: array, description: "Direct parent entities, empty when the entity has no registered parent.", items: { $ref: "#/components/schemas/GroupNode" } }
        subsidiaries: { type: array, description: "Direct subsidiaries owned by this entity, empty when it has none.", items: { $ref: "#/components/schemas/GroupNode" } }
        effectiveSharePct: { type: number, description: "Effective ownership share through the whole chain, as a percentage." }
        depth: { type: integer, description: Steps from the queried company to this node. }
        isTerminalNode: { type: boolean, description: "Whether the chain ends here, with no registered owner above." }
    FinancialStatement:
      type: object
      description: A filed annual financial statement (regnskap) for a company, from Regnskapsregisteret.
      required: [year, currency]
      properties:
        year: { type: integer, description: Accounting year. }
        currency: { type: string, description: "ISO 4217, e.g. NOK or SEK." }
        revenue: { $ref: "#/components/schemas/Money" }
        operatingResult: { $ref: "#/components/schemas/Money" }
        operatingResultBeforeDepreciation: { $ref: "#/components/schemas/Money" }
        liabilities: { $ref: "#/components/schemas/Money" }
        netResult: { $ref: "#/components/schemas/Money" }
        equity: { $ref: "#/components/schemas/Money" }
        totalAssets: { $ref: "#/components/schemas/Money" }
        employees: { type: integer, description: Average number of employees during the year. }
        profitMarginPct: { type: number, description: Net result as a percentage of revenue. }
        announcedDate: { type: string, format: date, description: When the statement was filed. }
        isConsolidated: { type: boolean, description: Whether the figures are group figures rather than the parent company alone. }
        yoy:

          type: object
          description: Year-over-year change versus the prior filed statement, in percentage points.
          properties:
            revenuePct: { type: number, description: "Change in revenue versus the prior year, in percentage points." }
            netResultPct: { type: number, description: "Change in net result versus the prior year, in percentage points." }
    Premises:
      type: object
      description: A business premises (forretningsadresse) the company has registered, current or historical.
      required: [property]
      properties:
        property: { $ref: "#/components/schemas/Property" }
        unitNumber: { type: string, description: "The unit the company occupies, when known." }
        sinceDate: { type: string, format: date, description: Date the company registered this premises as its business address. }
        untilDate: { type: string, format: date, description: "When the company deregistered the premises, absent while it is current." }
        buildingType: { type: string, description: "Registered building type at the address, e.g. Kontorbygning." }
        verification: { $ref: "#/components/schemas/Verification" }
    EmployeeCount:
      type: object
      description: A company's registered employee count for one month, from Brønnøysundregistrenes Enhetsregisteret.
      required: [period, count, observed]
      properties:
        period: { type: string, pattern: "^[0-9]{4}-(0[1-9]|1[0-2])$", description: "Month, YYYY-MM." }
        count: { type: integer, description: Registered number of employees. }
        observed: { type: boolean, description: Whether the count is a confirmed monthly value rather than interpolated. }
    AreaStatistics:
      type: object
      description: Aggregate statistics for a kommune, grunnkrets or postal code.
      required: [area, asOfDate]
      properties:
        area:
          type: object
          description: The area the statistics describe.
          required: [id, kind]
          properties:
            id: { type: string, description: "Area identifier, matching the areaId path parameter." }
            kind: { type: string, enum: [MUNICIPALITY, BASIC_STATISTICAL_UNIT, POSTAL_CODE], description: Area granularity. }
            name: { type: string, description: Area name., x-pii: false }
        population: { type: integer, description: Registered population. }
        populationByGender:
          type: object
          description: Registered population split by gender.
          properties:
            male: { type: integer, description: Registered men. }
            female: { type: integer, description: Registered women. }
        populationByAgeGroup:
          type: array
          description: "Registered population by age group, youngest first."
          items: { $ref: "#/components/schemas/GroupCount" }
        populationByEducationLevel:
          type: array
          description: Registered population by highest completed education level.
          items: { $ref: "#/components/schemas/GroupCount" }
        populationHistory:
          type: array
          description: "Registered population per year, oldest first."
          items: { $ref: "#/components/schemas/YearValue" }
        populationProjection:
          type: array
          description: "Projected population per year, from Statistisk sentralbyrå (SSB)."
          items: { $ref: "#/components/schemas/YearValue" }
        averageAge: { type: number, description: Average age of the registered population. }
        daytimePopulation: { type: integer, description: People present in the area during working hours. }
        commuters:
          type: object
          description: Daily commuting across the area boundary.
          properties:
            inbound: { type: integer, description: People commuting into the area. }
            outbound: { type: integer, description: People commuting out of the area. }
        households:
          type: object
          description: Households in the area.
          properties:
            count: { type: integer, description: Number of households. }
            averageSize: { type: number, description: Average number of people per household. }
            byComposition:
              type: array
              description: "Households by composition, e.g. couple with children."
              items: { $ref: "#/components/schemas/GroupCount" }
        housing:
          type: object
          description: The housing stock in the area.
          properties:
            unitCount: { type: integer, description: Dwelling units in the area. }
            cabinCount: { type: integer, description: Holiday homes in the area. }
            averageAreaM2: { type: number, description: Average dwelling area in square meters. }
            averageBuiltYear: { type: integer, description: Average year of completion for the dwellings. }
            averagePrice: { $ref: "#/components/schemas/Money" }
            byType:
              type: array
              description: "Dwellings by type, e.g. Enebolig or Blokkleilighet."
              items: { $ref: "#/components/schemas/GroupCount" }
        employeeCount: { type: integer, description: People employed at workplaces in the area. }
        medianIncome: { $ref: "#/components/schemas/Money" }
        totalIncome: { $ref: "#/components/schemas/Money" }
        averageWealth: { $ref: "#/components/schemas/Money" }
        transactionsLast12Months: { type: integer, description: Recorded property transactions in the trailing 12 months. }
        medianPricePerM2: { $ref: "#/components/schemas/Money" }
        marketActivity: { type: string, enum: [LOW, MEDIUM, HIGH], description: Qualitative transaction-volume tier for the area. }
        priceHistory:
          type: array
          description: "Price per square meter per quarter, oldest first."
          items: { $ref: "#/components/schemas/PricePoint" }
        asOfDate: { type: string, format: date, description: The date the statistics were computed as of. }
    GroupCount:
      type: object
      description: "One bucket in a distribution: its label, how many fall in it and its share of the total."
      required: [label, count]
      properties:
        label: { type: string, description: Bucket label., x-pii: false }
        count: { type: integer, description: How many fall in the bucket. }
        sharePct: { type: number, description: "The bucket's share of the total, as a percentage." }
    YearValue:
      type: object
      description: One year and its value in a time series.
      required: [year, value]
      properties:
        year: { type: integer, description: Year. }
        value: { type: number, description: Value for that year. }
    PricePoint:
      type: object
      description: Price per square meter for one quarter, with the transaction volume behind it.
      required: [quarter]
      properties:
        quarter: { type: string, pattern: "^[0-9]{4}-Q[1-4]$", description: "Quarter, YYYY-Qn." }
        medianPricePerM2: { $ref: "#/components/schemas/Money" }
        transactionCount: { type: integer, description: Recorded transactions in the quarter. }
        dwellingType: { type: string, description: "The dwelling type the figure covers, absent when it covers all types." }
    LandAllocation:
      type: object
      description: "A markanvisning (land allocation tender) for a plot, sourced from Combify for Sweden. Norway has no equivalent public register."
      required: [id, title, municipality, status]
      properties:
        id: { type: string, description: Tender identifier. }
        title: { type: string, description: Tender title. }
        municipality: { $ref: "#/components/schemas/Municipality" }
        status: { type: string, enum: [OPEN, CLOSED, AWARDED], description: Tender status. }
        deadlineDate: { type: string, format: date, description: Deadline for submitting a proposal. }
        areaM2: { type: number, description: Plot area in square meters. }
        documents: { type: array, description: Tender documents., items: { $ref: "#/components/schemas/Document" } }
    SubscriptionTarget:
      type: object
      description: The resource whose change events trigger delivery.
      required: [kind]
      additionalProperties: false
      properties:
        kind: { type: string, enum: [PROPERTY, COMPANY], description: Resource type the subscription targets. }
        country: { type: string, description: "ISO 3166-1 alpha-2, present for a PROPERTY target." }
        cadastreId: { type: string, description: "Cadastre identifier, present for a PROPERTY target." }
        scheme: { type: string, description: "ISO 6523 ICD code, present for a COMPANY target." }
        id: { type: string, description: "Register identifier, present for a COMPANY target." }
    Subscription:
      type: object
      description: A subscription to change events for a resource, delivered as signed CloudEvents 1.0 webhooks.
      required: [id, target, events, webhookUrl, status, createdAt]
      properties:
        id: { type: string, description: Subscription identifier. }
        target: { $ref: "#/components/schemas/SubscriptionTarget" }
        events:
          type: array
          description: Event types delivered to this subscription.
          items: { type: string, x-extensible-enum: [OWNER_CHANGED, TENANT_CHANGED, TRANSACTION_REGISTERED, BUILDING_PERMIT_CHANGED, ZONING_PLAN_CHANGED] }
        webhookUrl: { type: string, format: uri, description: The HTTPS endpoint events are delivered to. }
        status: { type: string, enum: [ACTIVE, PAUSED], description: Subscription status. }
        createdAt: { type: string, format: date-time, description: When the subscription was created. }
    TokenResponse:
      type: object
      description: "An OAuth 2 client-credentials token response (RFC 6749 section 4.4.3). Field names are snake_case, the platform's one exception to camelCase, because they are the wire names the OAuth spec fixes."
      required: [access_token, token_type, expires_in]
      properties:
        access_token: { type: string, description: Bearer token to use as the Authorization header. }
        token_type: { type: string, enum: [Bearer], description: Always "Bearer". }
        expires_in: { type: integer, description: Seconds until the token expires. }
        scope: { type: string, description: "Space-delimited scopes granted, when narrower than the client's full grant." }
    TokenError:
      type: object
      description: An RFC 6749 section 5.2 token error response. Used only by createToken; every other error response on this API is RFC 9457 Problem Details.
      required: [error]
      properties:
        error: { type: string, enum: [invalid_request, invalid_client, invalid_grant, unauthorized_client, invalid_scope], description: RFC 6749 error code. }
        error_description: { type: string, description: Human-readable detail about the error. }
    Me:
      type: object
      description: The identity, tier and quota usage of the caller's client credentials.
      required: [clientId, tier, scopes, dailyCallLimit, callsToday]
      properties:
        clientId: { type: string, description: The calling client's id. }
        tier: { type: string, enum: [SANDBOX, STANDARD, ENTERPRISE], description: Client's platform tier. }
        scopes: { type: array, description: Scopes granted to the client., items: { type: string } }
        dailyCallLimit: { type: integer, description: "Calls allowed per calendar day, UTC; resets at 00:00 UTC." }
        callsToday: { type: integer, description: "Calls made so far this calendar day, UTC; resets at 00:00 UTC." }
    ApiCatalog:
      type: object
      description: The IETF api-catalog document listing this API with its status, scopes and links to spec, docs and changelog.
      required: [linkset]
      properties:
        linkset: { type: array, description: One entry per listed API., items: { type: object, description: A single api-catalog linkset entry. } }
