Skip to content

REST API

The web app is a front end for this API. Interactive docs, generated by FastAPI, are at /docs on a running server.

Endpoints

Method Path Purpose
GET /api/presets Named example areas, grouped
GET /api/search?q=... Place search; each hit has a bbox
POST /api/upload Multipart heightmap upload; returns an upload_id
POST /api/model Build a model; returns stats, a preview PNG and download URLs
POST /api/jobs Same body as /api/model, built in the background; returns a job_id
GET /api/jobs/{id} Job status, current stage with done and total, and the /api/model response as result when done
GET /api/model/{id}/{name}.stl Binary STL
GET /api/model/{id}/{name}.glb Textured GLB, when glb_url is set
GET /api/model/{id}/{name}.3mf Multi-color 3MF, when threemf_url is set
GET /api/model/{id}/heightmap.png Hillshade preview

Build a model

curl -s localhost:7417/api/model -H 'content-type: application/json' -d '{
  "source": "terrarium",
  "bbox": {"south": 35.28, "west": 138.65, "north": 35.45, "east": 138.82},
  "width_mm": 150, "exaggeration": 1.2, "resolution": 512, "name": "fuji"
}' | python -c 'import json,sys; j=json.load(sys.stdin); print(j["stl_url"], j["info"]["height_mm"])'

The request body takes the same settings as the web app:

Field Default Meaning
source terrarium terrarium (satellite elevation), synthetic or upload
bbox {south, west, north, east}, for terrarium
upload_id From /api/upload, for upload
resolution 256 Grid columns, 32 to 1024
width_mm 100 Model width
base_mm 3 Base thickness
exaggeration 1.5 Vertical exaggeration
relief_mm Fixed relief height; overrides exaggeration
smoothing 0 Gaussian smoothing, in grid pixels
clamp_sea_level true Flatten below-sea-level data
texture true Also write the textured GLB
buildings false Add OpenStreetMap buildings
building_scale 1 Building height multiplier
building_source auto auto, openfreemap, overpass or overture
bridges false Add OpenStreetMap bridges over water
bridge_piers_mm 20 Longest distance between bridge piers; 0 for none
roads false Add OpenStreetMap roads as raised strips
road_detail auto auto (by model scale), major (motorway to secondary) or all
multicolor false Also write the multi-color 3MF
frame_mm 0 Border frame width; 0 for none
frame_height_mm base + 1 Frame height
name terrain Model name, used in the file names

Buildings, bridges, roads, the texture and the multi-color 3MF need a terrarium source. When one of their downloads fails, you still get the STL, and info says why in building_error, bridge_error, road_error, texture_error or water_error. With bridges on, info.bridges is the number of bridges built, and with roads on, info.roads is the number of connected road networks. When the roof shapes could not be fetched, the buildings are flat-roofed and building_warning says so.

Build in the background

POST /api/jobs takes the same body and returns at once. Poll GET /api/jobs/{id} until status is done or error:

{"job_id": "a156e11b566b", "status": "running", "stage": "buildings",
 "done": 4, "total": 9, "elapsed_s": 1.2, "result": null, "error": null}

When it is done, result holds the same response /api/model returns.