Open Landmarks

Open Landmarks / Documentation

API reference

Discover landmarks by location and download their models, metadata and editable sources.

Base URLhttps://open-landmarks.benmaps.fr

No API key required. All resources support GET, HEAD and cross-origin reads. Resolve returned paths against the base URL.

Start with a collection, resolve its release, then request tiles from the catalogue. Fetch model files only when needed.

List collections

GET/api/v1/collections.json

Returns the available collections and their release endpoints.

Path parameters None.

200 OK · application/json
A collection directory.

FieldTypeDescription
schemaVersionintegerResponse schema version; currently 1.
collectionsobject[]Available collections.
collections[].idstringCollection ID used in request paths.
collections[].namestringDisplay name.
collections[].lateststringPath to the approved release pointer.
collections[].previewstringPath to the release pointer that includes drafts.
Response example
{
  "schemaVersion": 1,
  "collections": [
    {
      "id": "paris",
      "name": "Paris",
      "latest": "/api/v1/collections/paris/latest.json",
      "preview": "/api/v1/collections/paris/preview.json"
    }
  ]
}

Cache: 60 seconds · revalidate. Open example ↗

Get a release

GET/api/v1/collections/{collection}/{channel}.json

Resolves a channel to its current release. Save the returned catalogue path to pin that release.

Path parameters collection — collection ID; currently paris. channellatest for approved models, or preview to include drafts.

200 OK · application/json
A release pointer. An empty collection returns 200 with count: 0. Paris currently has 0 approved models and 19 models in preview.

FieldTypeDescription
schemaVersionintegerResponse schema version.
collectionstringCollection ID.
channelstringapproved for latest.json; preview for preview.json.
releasestringImmutable release ID.
countintegerNumber of models in this release.
cataloguestringPath to the pinned catalogue.
Response example
{
  "schemaVersion": 1,
  "collection": "paris",
  "channel": "preview",
  "release": "preview-6888a88a977e02a90d28",
  "count": 19,
  "catalogue": "/api/v1/collections/paris/preview-6888a88a977e02a90d28/catalogue.json"
}

Cache: 60 seconds · revalidate. Open example ↗

Get a catalogue

GET/api/v1/collections/{collection}/{release}/catalogue.json

Returns spatial index information and links to the full collection data.

Path parameters collection — collection ID; currently paris. release — exact release ID returned by a pointer.

200 OK · application/json
A catalogue for the requested release.

FieldTypeDescription
schemaVersion / collection / release / channel / countinteger / stringSchema version, collection ID, release ID, channel and model count, as in the release pointer.
statusstringapproved-only or includes-unreviewed-drafts.
assetBasestringOrigin-relative asset root.
boundsnumber[4]Collection extent: [west, south, east, north], WGS84 degrees.
maxHeightMnumberMaximum model height in metres; useful for padding discovery.
index.zoomintegerFixed index zoom; currently 12.
index.templatestringTile path template with {x} and {y} placeholders.
index.occupiedstring[]Available cells, each formatted as "x/y".
assetsstringPath to all model metadata in this release.
sourceDatabasestringPath to the complete spatial source database.
attribution / dataLicensestringCollection credit and spatial data license.
Response example
{
  "schemaVersion": 1,
  "collection": "paris",
  "release": "preview-6888a88a977e02a90d28",
  "channel": "preview",
  "count": 19,
  "status": "includes-unreviewed-drafts",
  "assetBase": "/",
  "bounds": [
    2.224,
    48.815,
    2.422,
    48.903
  ],
  "maxHeightM": 330,
  "attribution": "Open Landmarks; © OpenStreetMap contributors",
  "dataLicense": "ODbL-1.0",
  "index": {
    "zoom": 12,
    "template": "/api/v1/collections/paris/preview-6888a88a977e02a90d28/index/12/{x}/{y}.json",
    "occupied": [
      "2074/1408",
      "2074/1409"
    ]
  },
  "assets": "/api/v1/collections/paris/preview-6888a88a977e02a90d28/assets.json",
  "sourceDatabase": "/api/v1/collections/paris/preview-6888a88a977e02a90d28/spatial-database.json"
}

Cache: 1 year · immutable. Open example ↗

Get a tile

GET/api/v1/collections/{collection}/{release}/index/12/{x}/{y}.json

Returns metadata for whole models whose ground bounding boxes intersect an XYZ cell.

Path parameters collection — collection ID; currently paris. release — exact release ID returned by a pointer. x, y — integer Web Mercator tile coordinates at zoom 12 (0–4095). Use cells listed in index.occupied.

200 OK · application/json
A tile containing model entries. Unoccupied cells return 404. Entries contain placement, download and attribution fields; full provenance is available at each entry’s metadata path.

FieldTypeDescription
schemaVersionintegerResponse schema version.
collection / releasestringCollection and pinned release IDs.
assetsobject[]Model entries; see metadata fields below.
Response example · selected fields
{
  "schemaVersion": 1,
  "collection": "paris",
  "release": "preview-6888a88a977e02a90d28",
  "assets": [
    {
      "id": "arc-de-triomphe",
      "revision": "8ea265d6b3888c689ef99becc97d3ab83a6b939781400296b6d7a95382f37388",
      "anchor": [
        2.2950372754957606,
        48.87377739317819
      ],
      "minZoom": 15,
      "detailZoom": 17,
      "metadata": "/assets/arc-de-triomphe/f1e1b02cf17b1127d9015c19f2e0e4cbd52cb4af6413c13705b2a881b030240d/asset.json",
      "lods": {
        "low": {
          "url": "/models/arc-de-triomphe/5f24023c2900c7fba23c437ed54998f9ce48b7d1f57ea0190f71fb6504951905/low.glb",
          "bytes": 26068,
          "sha256": "5f24023c2900c7fba23c437ed54998f9ce48b7d1f57ea0190f71fb6504951905",
          "triangles": 328,
          "gzip": {
            "url": "/models/arc-de-triomphe/5f24023c2900c7fba23c437ed54998f9ce48b7d1f57ea0190f71fb6504951905/low.glb.gz",
            "bytes": 7663,
            "sha256": "70a4cb0b52e219b4883bb19bf6afec983b8af0425e62e2a7c2c43f7943af3eb1",
            "encoding": "gzip-file"
          }
        },
        "detail": {
          "url": "/models/arc-de-triomphe/6a20bf7b3e94ae94141c04460c3091f4dabbbd5b7fac6c36bfc13b4aded07b1a/detail.glb",
          "bytes": 59668,
          "sha256": "6a20bf7b3e94ae94141c04460c3091f4dabbbd5b7fac6c36bfc13b4aded07b1a",
          "triangles": 854,
          "gzip": {
            "url": "/models/arc-de-triomphe/6a20bf7b3e94ae94141c04460c3091f4dabbbd5b7fac6c36bfc13b4aded07b1a/detail.glb.gz",
            "bytes": 13998,
            "sha256": "edff4af9d659b36834c7721cad81e86cfce1e8857ce8d1ed33e76ccd8f13fda9",
            "encoding": "gzip-file"
          }
        }
      }
    },
    {
      "id": "madeleine",
      "revision": "78f23431e42eeb3c2ef04ab0915ce034787bbbd938ee118340937d43651864d6",
      "anchor": [
        2.3244654965105203,
        48.87002795311704
      ],
      "minZoom": 15,
      "detailZoom": 17,
      "metadata": "/assets/madeleine/c51042d1ab50a7cfa7b257d7e6888526b440115785686641b2a10cc9d105180d/asset.json",
      "lods": {
        "low": {
          "url": "/models/madeleine/4a5e1b8bb98072a447ab91540271d3987af265f4ca4a6d257d49069a5a5d1ee8/low.glb",
          "bytes": 214184,
          "sha256": "4a5e1b8bb98072a447ab91540271d3987af265f4ca4a6d257d49069a5a5d1ee8",
          "triangles": 4986,
          "gzip": {
            "url": "/models/madeleine/4a5e1b8bb98072a447ab91540271d3987af265f4ca4a6d257d49069a5a5d1ee8/low.glb.gz",
            "bytes": 55274,
            "sha256": "a3abd6a20bfae2ec8302efbdb4d177b38c684d97a5b41b3a70943a407f5f67a4",
            "encoding": "gzip-file"
          }
        },
        "detail": {
          "url": "/models/madeleine/028ab6604efb08d34d323609383502bae20113206506318ff15b88114df01aeb/detail.glb",
          "bytes": 218072,
          "sha256": "028ab6604efb08d34d323609383502bae20113206506318ff15b88114df01aeb",
          "triangles": 5066,
          "gzip": {
            "url": "/models/madeleine/028ab6604efb08d34d323609383502bae20113206506318ff15b88114df01aeb/detail.glb.gz",
            "bytes": 56579,
            "sha256": "29f63d5840afd5ddcc990a53ce9fde811e8fc8cc9b2c7cd895d50cad2d0d5a94",
            "encoding": "gzip-file"
          }
        }
      }
    },
    {
      "id": "obelisque-de-louxor",
      "revision": "cd3b30a9a9d30d206a28fbfed159cd512046cb09d1fbac9bf16eddea2dc2e9cf",
      "anchor": [
        2.3211306,
        48.8654765
      ],
      "minZoom": 15,
      "detailZoom": 17,
      "metadata": "/assets/obelisque-de-louxor/3d9419d5f16a98b56d2a2f04a61c5026a0e218d35bf7200630c82c92739df30b/asset.json",
      "lods": {
        "low": {
          "url": "/models/obelisque-de-louxor/1d6043fee8231c81a4afa4092c4e0ed20e985ef9960089689311e43bd04fc435/low.glb",
          "bytes": 8352,
          "sha256": "1d6043fee8231c81a4afa4092c4e0ed20e985ef9960089689311e43bd04fc435",
          "triangles": 102,
          "gzip": {
            "url": "/models/obelisque-de-louxor/1d6043fee8231c81a4afa4092c4e0ed20e985ef9960089689311e43bd04fc435/low.glb.gz",
            "bytes": 2065,
            "sha256": "f64a570df0bcb24e5f5992cd8bf81dec6c0188f692a7c1500328d22d70c6b32d",
            "encoding": "gzip-file"
          }
        },
        "detail": {
          "url": "/models/obelisque-de-louxor/1d6043fee8231c81a4afa4092c4e0ed20e985ef9960089689311e43bd04fc435/detail.glb",
          "bytes": 8352,
          "sha256": "1d6043fee8231c81a4afa4092c4e0ed20e985ef9960089689311e43bd04fc435",
          "triangles": 102,
          "gzip": {
            "url": "/models/obelisque-de-louxor/1d6043fee8231c81a4afa4092c4e0ed20e985ef9960089689311e43bd04fc435/detail.glb.gz",
            "bytes": 2065,
            "sha256": "f64a570df0bcb24e5f5992cd8bf81dec6c0188f692a7c1500328d22d70c6b32d",
            "encoding": "gzip-file"
          }
        }
      }
    },
    {
      "id": "opera-garnier",
      "revision": "43d262cc7e40ded47968846500d177d59e22a9b8bf7ff056e63ede30a4876197",
      "anchor": [
        2.331716682733388,
        48.872017348646814
      ],
      "minZoom": 15,
      "detailZoom": 17,
      "metadata": "/assets/opera-garnier/45e1f361d74ca3c254d815e719688be5e76d7ca81329e85670bbf93b42358570/asset.json",
      "lods": {
        "low": {
          "url": "/models/opera-garnier/492263ca770f1b0e4b140847540e9c1b6a9056e3fd0196936ab040a00315210a/low.glb",
          "bytes": 207192,
          "sha256": "492263ca770f1b0e4b140847540e9c1b6a9056e3fd0196936ab040a00315210a",
          "triangles": 5006,
          "gzip": {
            "url": "/models/opera-garnier/492263ca770f1b0e4b140847540e9c1b6a9056e3fd0196936ab040a00315210a/low.glb.gz",
            "bytes": 65262,
            "sha256": "dcad5752b57fce569869a7a7e1d01528e131109daf3ae76c4561af41f11916e1",
            "encoding": "gzip-file"
          }
        },
        "detail": {
          "url": "/models/opera-garnier/ad41e82ccfa9cac107d2fd0768ddfe79bf4ec1e5d81d8f5c811452b205553cd5/detail.glb",
          "bytes": 221796,
          "sha256": "ad41e82ccfa9cac107d2fd0768ddfe79bf4ec1e5d81d8f5c811452b205553cd5",
          "triangles": 5324,
          "gzip": {
            "url": "/models/opera-garnier/ad41e82ccfa9cac107d2fd0768ddfe79bf4ec1e5d81d8f5c811452b205553cd5/detail.glb.gz",
            "bytes": 69895,
            "sha256": "9238474dedd5267cd4d4a1fdb835299696a3581133b45d248f2abea25c5526eb",
            "encoding": "gzip-file"
          }
        }
      }
    },
    {
      "id": "porte-saint-denis",
      "revision": "4678a16c0db3fd18831c51f77fed5cb3c897918423bb5844697825da187b7cf9",
      "anchor": [
        2.3526864847636175,
        48.86979333713185
      ],
      "minZoom": 15,
      "detailZoom": 17,
      "metadata": "/assets/porte-saint-denis/a2a4e8d1df0c86b8543504e73c37b133b7064e6bdc099e86513f3e483e7c12cb/asset.json",
      "lods": {
        "low": {
          "url": "/models/porte-saint-denis/ee0e82b7e9e54046143a75c0211de6b7a1e0f2fca58ed0630a46a9519175d23d/low.glb",
          "bytes": 14212,
          "sha256": "ee0e82b7e9e54046143a75c0211de6b7a1e0f2fca58ed0630a46a9519175d23d",
          "triangles": 240,
          "gzip": {
            "url": "/models/porte-saint-denis/ee0e82b7e9e54046143a75c0211de6b7a1e0f2fca58ed0630a46a9519175d23d/low.glb.gz",
            "bytes": 3932,
            "sha256": "046d6309e86978f92f106f5026dfeee921749c5c0c2b509990a95b62d0f9d21b",
            "encoding": "gzip-file"
          }
        },
        "detail": {
          "url": "/models/porte-saint-denis/ee0e82b7e9e54046143a75c0211de6b7a1e0f2fca58ed0630a46a9519175d23d/detail.glb",
          "bytes": 14212,
          "sha256": "ee0e82b7e9e54046143a75c0211de6b7a1e0f2fca58ed0630a46a9519175d23d",
          "triangles": 240,
          "gzip": {
            "url": "/models/porte-saint-denis/ee0e82b7e9e54046143a75c0211de6b7a1e0f2fca58ed0630a46a9519175d23d/detail.glb.gz",
            "bytes": 3932,
            "sha256": "046d6309e86978f92f106f5026dfeee921749c5c0c2b509990a95b62d0f9d21b",
            "encoding": "gzip-file"
          }
        }
      }
    },
    {
      "id": "rotonde-de-chartres",
      "revision": "378d940580d16470b89eae4db72077cd24aa578d3524dfc453bf795ca4aeb6a3",
      "anchor": [
        2.3090852088658123,
        48.88025623425205
      ],
      "minZoom": 15,
      "detailZoom": 17,
      "metadata": "/assets/rotonde-de-chartres/aa55af76544581737a77dda4b5e2e2455d34dad7a1b94ae59ff25bdeef7ac397/asset.json",
      "lods": {
        "low": {
          "url": "/models/rotonde-de-chartres/ec72ee5bfbd4c04b4921b8db0f8952bd704bb776ad9456c5b2da9e398837a880/low.glb",
          "bytes": 84828,
          "sha256": "ec72ee5bfbd4c04b4921b8db0f8952bd704bb776ad9456c5b2da9e398837a880",
          "triangles": 2242,
          "gzip": {
            "url": "/models/rotonde-de-chartres/ec72ee5bfbd4c04b4921b8db0f8952bd704bb776ad9456c5b2da9e398837a880/low.glb.gz",
            "bytes": 29203,
            "sha256": "6563e43a983dc2023842d17a38b0ebe480a123f86083558105c519aeff268025",
            "encoding": "gzip-file"
          }
        },
        "detail": {
          "url": "/models/rotonde-de-chartres/db76b35e1c3164f917571bb4621e4cfdf20441e575daa50190c217b7bef33dde/detail.glb",
          "bytes": 84828,
          "sha256": "db76b35e1c3164f917571bb4621e4cfdf20441e575daa50190c217b7bef33dde",
          "triangles": 2242,
          "gzip": {
            "url": "/models/rotonde-de-chartres/db76b35e1c3164f917571bb4621e4cfdf20441e575daa50190c217b7bef33dde/detail.glb.gz",
            "bytes": 29577,
            "sha256": "3e40db4f7feded557519b8d673de4bc524ebb2b09c88cfabfe9d29546e9185bc",
            "encoding": "gzip-file"
          }
        }
      }
    },
    {
      "id": "sacre-coeur",
      "revision": "a8970a9daf14b507ba42caaef3983af4bce4d7f91e8a652b52d1f65aedd81f08",
      "anchor": [
        2.34301938375587,
        48.8867725388431
      ],
      "minZoom": 15,
      "detailZoom": 17,
      "metadata": "/assets/sacre-coeur/cd6cbf903db79f3a7dba898f9c1f73aac680e365c3871eae615b50cde40f6715/asset.json",
      "lods": {
        "low": {
          "url": "/models/sacre-coeur/e2e3c7ca84dae1b7a72444da50d46efebd1f55927da755aa64623cc85e826d3e/low.glb",
          "bytes": 207332,
          "sha256": "e2e3c7ca84dae1b7a72444da50d46efebd1f55927da755aa64623cc85e826d3e",
          "triangles": 5324,
          "gzip": {
            "url": "/models/sacre-coeur/e2e3c7ca84dae1b7a72444da50d46efebd1f55927da755aa64623cc85e826d3e/low.glb.gz",
            "bytes": 78333,
            "sha256": "b4c8105cb516ff561a92ed847ecc82eb05ce59e030eebf3c9bc4e78f2d373685",
            "encoding": "gzip-file"
          }
        },
        "detail": {
          "url": "/models/sacre-coeur/cb0d948cbbe01ddd439e318ebaff7cf6974640745d55dbb3f66a10742b92d3b8/detail.glb",
          "bytes": 211448,
          "sha256": "cb0d948cbbe01ddd439e318ebaff7cf6974640745d55dbb3f66a10742b92d3b8",
          "triangles": 5410,
          "gzip": {
            "url": "/models/sacre-coeur/cb0d948cbbe01ddd439e318ebaff7cf6974640745d55dbb3f66a10742b92d3b8/detail.glb.gz",
            "bytes": 79845,
            "sha256": "47aa65d983563d0b5a6ea79164d1c9e31b1cb2238508ec157ebc86e2022024e9",
            "encoding": "gzip-file"
          }
        }
      }
    }
  ]
}

Cache: 1 year · immutable. Open example ↗

Request occupied cells intersecting a padded viewport. Models can appear in several cells; deduplicate by id and revision. Account for camera pitch and tall buildings, then cull against 3D bounds.

Get model metadata

GET/assets/{id}/{publicationRevision}/asset.json

Returns placement, downloads, provenance and review information for one model. Follow the metadata path from a tile or the full collection response.

Path parameters id — model ID. publicationRevision — metadata revision from the model entry.

200 OK · application/json
A model metadata object.

FieldTypeDescription
id / namestringStable model ID and display name.
revision / publicationRevisionstringContent revision; metadata revision also includes review state.
approvedbooleanWhether this exact content revision has been approved.
anchornumber[2]WGS84 [longitude, latitude].
axes / units / headingstring / numberGLB orientation and units. Heading is baked into the geometry.
boundsnumber[4]Ground bounding box: [west, south, east, north].
boundsBlenderMnumber[2][3]Local [min, max] corners, X east / Y north / Z up, in metres.
minZoom / detailZoomnumberSuggested display and detail-LOD zoom thresholds.
lods.low / lods.detailobjectRaw GLB url, bytes, sha256, triangles and a gzip download descriptor.
source / spatialSource / previewobjectDownload descriptors: url, bytes and sha256.
metadata / validationstringPaths to this metadata and its structural validation report.
replacementFootprint / basemapReplacementobjectFootprint and optional dataset-specific extrusion replacement hints.
entranceLightsnumber[][3]Optional local light anchors in GLB axes.
authors / attribution / artisticLicense / spatialDataLicense / licenseScopearray / stringAuthorship, credits and component licensing.
osm / references / assistance / reviewobject / array / stringSource provenance, reference credits, assistance disclosure and review record.
Response example · selected fields
{
  "id": "arc-de-triomphe",
  "name": "Arc de Triomphe",
  "revision": "8ea265d6b3888c689ef99becc97d3ab83a6b939781400296b6d7a95382f37388",
  "publicationRevision": "f1e1b02cf17b1127d9015c19f2e0e4cbd52cb4af6413c13705b2a881b030240d",
  "approved": false,
  "anchor": [
    2.2950372754957606,
    48.87377739317819
  ],
  "axes": "X east / Y up / Z south",
  "units": "metres",
  "heading": 0,
  "minZoom": 15,
  "detailZoom": 17,
  "boundsBlenderM": [
    [
      -23.76016616821289,
      -29.079904556274414,
      0
    ],
    [
      24.12613296508789,
      29.421850204467773,
      50
    ]
  ],
  "lods": {
    "low": {
      "url": "/models/arc-de-triomphe/5f24023c2900c7fba23c437ed54998f9ce48b7d1f57ea0190f71fb6504951905/low.glb",
      "bytes": 26068,
      "sha256": "5f24023c2900c7fba23c437ed54998f9ce48b7d1f57ea0190f71fb6504951905",
      "triangles": 328,
      "gzip": {
        "url": "/models/arc-de-triomphe/5f24023c2900c7fba23c437ed54998f9ce48b7d1f57ea0190f71fb6504951905/low.glb.gz",
        "bytes": 7663,
        "sha256": "70a4cb0b52e219b4883bb19bf6afec983b8af0425e62e2a7c2c43f7943af3eb1",
        "encoding": "gzip-file"
      }
    },
    "detail": {
      "url": "/models/arc-de-triomphe/6a20bf7b3e94ae94141c04460c3091f4dabbbd5b7fac6c36bfc13b4aded07b1a/detail.glb",
      "bytes": 59668,
      "sha256": "6a20bf7b3e94ae94141c04460c3091f4dabbbd5b7fac6c36bfc13b4aded07b1a",
      "triangles": 854,
      "gzip": {
        "url": "/models/arc-de-triomphe/6a20bf7b3e94ae94141c04460c3091f4dabbbd5b7fac6c36bfc13b4aded07b1a/detail.glb.gz",
        "bytes": 13998,
        "sha256": "edff4af9d659b36834c7721cad81e86cfce1e8857ce8d1ed33e76ccd8f13fda9",
        "encoding": "gzip-file"
      }
    }
  },
  "source": {
    "url": "/assets/arc-de-triomphe/f1e1b02cf17b1127d9015c19f2e0e4cbd52cb4af6413c13705b2a881b030240d/source.blend.gz",
    "bytes": 103276,
    "sha256": "d9f31cd3b7674a3cb2d8d7b43e5a455881929516720acc8cb1c4475c6da22598"
  },
  "spatialSource": {
    "url": "/assets/arc-de-triomphe/f1e1b02cf17b1127d9015c19f2e0e4cbd52cb4af6413c13705b2a881b030240d/spatial-source.json",
    "bytes": 15594,
    "sha256": "b51f21c599595de082c0dff7a204ea4c73a9b38bbf1bb28f8dd921b87cd168ed"
  },
  "attribution": "Open Landmarks; contains © OpenStreetMap contributors, ODbL-1.0",
  "artisticLicense": "CC-BY-4.0",
  "spatialDataLicense": "ODbL-1.0"
}

Cache: 1 year · immutable. Open example ↗

Download a model

GET/models/{id}/{sha256}/{lod}.glb

Returns a complete, texture-free glTF binary. Use the download URL from lods.low or lods.detail.

Path parameters id — model ID. sha256 — hash of the raw GLB. lodlow or detail.

200 OK · model/gltf-binary
Binary GLB bytes. Append .gz for the explicit gzip file (application/gzip, no Content-Encoding); decompress it once before loading. The gzip descriptor gives the compressed size and hash.

Cache: 1 year · immutable. Open example ↗

JavaScript · download and decompress
const origin = 'https://open-landmarks.benmaps.fr';
const response = await fetch(new URL(asset.lods.detail.gzip.url, origin));
if (!response.ok) throw new Error('Model request failed');
const bytes = await new Response(response.body.pipeThrough(
  new DecompressionStream('gzip')
)).arrayBuffer();
// Pass bytes to a glTF loader.

Use the raw GLB where native gzip decompression is unavailable. V1 needs no Draco, Meshopt or texture decoder. Retain the current LOD until its replacement has loaded.

Collection data and sources

These GET resources also cache for one year. Follow their paths from the catalogue or model metadata.

FieldTypeDescription
catalogue.assetsJSON{schemaVersion, release, assets} with complete model metadata. Open example ↗
catalogue.sourceDatabaseJSON{license, attribution, assets} with OSM-derived source records. Open example ↗
asset.source.urlgzip fileEditable Blender source; decompress before opening.
asset.spatialSource.urlJSONPer-model OSM spatial source extract.
asset.preview.urlWebPStatic model preview.
asset.validationJSONStructural validation report.

HTTP behavior

FieldTypeDescription
200 OKsuccessResource exists. HEAD returns headers without a response body.
304 Not ModifiedcacheA conditional request can reuse the cached representation.
404 Not FounderrorUnknown resource, release, model or unoccupied tile. Error bodies are not a defined JSON schema.

The directory and release pointers revalidate after 60 seconds. Release data, model files and source revisions cache for one year and retain their URLs. JSON can use negotiated HTTP compression; explicit .gz files require client decompression. V1 has no server-side search or query filters.

Placement and attribution

GLB vertices use metres, X east / Y up / Z south, with ground at zero. Add terrain elevation once; do not reapply heading. Convert boundsBlenderM to GLB axes before culling.

Preserve material base colors and adapt light and emissive intensity to your scene. Suppress overlapping basemap extrusions after the model loads. basemapReplacement IDs apply only to the named dataset snapshot.

Retain each model’s attribution and source links, including © OpenStreetMap contributors. See licensing and attribution for component terms.