Data products
Alongside the tools, FastGIS publishes curated datasets you can search, filter and take offline. Each one declares its licence and attribution through the API, because several are share-alike and what you may do with the output depends on which source a feature came from.
Licence buckets
Every dataset endpoint has a sources companion — GET /mtb/sources,
GET /friluft/sources — returning per-source licence metadata rather than a
single blanket statement:
| Field | What it tells you |
|---|---|
bucket | A_verified for authoritative open data, C_share_alike for sources whose licence propagates |
license, license_source | The licence and where to read it |
attribution | The string you must display |
share_alike | Whether reusing this feature obliges you to share alike |
feature_count | How many features that source contributes |
Check the bucket before redistributing anything you derive.
MTB trails
A European mountain-bike catalogue built from OpenStreetMap cycling and MTB data — 1,266,642 features across 30-plus countries, ODbL 1.0, attributed to OpenStreetMap contributors.
| Browse the catalogue | GET /mtb/catalog |
| Query features in view | GET /mtb/features |
| One trail | GET /mtb/trail/{trail_id} |
| One route relation | GET /mtb/route/{rel_id} |
| Licence and coverage | GET /mtb/sources |
These endpoints are readable without an API key.
Friluftsliv
Norwegian outdoor-recreation points — 43,048 features from four sources with genuinely different terms:
| Source | Bucket | Licence | Features |
|---|---|---|---|
| Friluftslivsområder, kartlagte og verdsatte | A_verified | NLOD 2.0 | 8,097 |
| Statlig sikra friluftslivsområder | A_verified | NLOD 2.0 | 391 |
| Turrutebasen | A_verified | Open data, no named licence | 21,102 |
| OpenStreetMap friluft | C_share_alike | ODbL 1.0 | 13,458 |
GET /friluft/features queries them; GET /friluft/sources returns the table
above with bounding boxes and endpoints. Note the third row: open, but without a
named licence, which is not the same as public domain.
Beaches
Beach discovery with rider-contributed verdicts.
| Beaches in a region | GET /grass/beaches/review/{region} |
| Default region | GET /grass/beaches/review |
| Read verdicts | GET /grass/beaches/review/verdicts |
| Add a verdict | POST /grass/beaches/review/verdicts |
| Export | GET /grass/beaches/review/export |
The export is scoped to the caller: admins receive the full attributed report,
everyone else only their own verdicts (community totals per beach come from the
verdicts endpoint). The region assumed when a request omits one is set by
BEACH_REVIEW_DEFAULT_REGION.
Curvy roads
Roads scored for how interesting they are to ride, by one of three algorithms — accumulated turning, turning per kilometre, or corner tightness. The rider app exposes this as Find Curvy Roads; see the rider app guide.
The scores cover 44 regions: the 36 European ones and, since 10 October 2026, Morocco, Tunisia, Egypt, Mauritania, Senegal and the Gambia, Algeria, Libya and the Gulf states. That is about 1.07 million road sections, computed from OpenStreetMap. The curvature map layer and the offline tiles cover the same regions.
| Search near a point | GET /grass/curvature/nearby |
| Score a drawn area | POST /grass/curvature/analyze |
| Score against the prebuilt database | POST /grass/curvature/analyze-precomputed |
| Road classes available | GET /grass/curvature/road-classes |
| Database freshness | GET /grass/curvature/db-status |
Practice grounds
Places to practise riding: motocross tracks, trial and enduro areas, supermoto and speedway tracks, karting and other motor-sport circuits, built from OpenStreetMap (ODbL 1.0) for every region the POI import covers and refreshed monthly. A ground is either a mapped outline (a sports centre, a track, a pitch) or, where only the racing lines are mapped, one ground per cluster of lines within 1 km of each other.
Each ground says what OpenStreetMap knows about it: its kinds, size, surface, fee, opening hours, website, operator, and how you may use it:
legality | Meaning |
|---|---|
open | Open to the public |
members | Members or customers only |
in_doubt | Access not stated in OpenStreetMap: check before you go |
A ground that OpenStreetMap marks private, or that lies inside a military
zone, is never published: not on the map, not in search, not in the
catalogue, not in the offline packs. A ground inside a protected area (a
national or regional park, a nature reserve, a Natura 2000 site) stays
published and says so: protected lists the classes it lies in.
| Search near a point | GET /grass/routing/nearby?category=practice_ground (alias practice, up to 250 km) |
| One ground, with the upcoming public events held within 500 m | GET /grass/routing/practice-grounds/{osm_id} |
Holding an event at a ground. An organiser saves the ground to their library and adds it as
their event's Start stop (POST /events/{id}/stops with kind: "start"; the Briefing stop
counts while there is no Start stop). The server then places the event there itself — an event's
meeting place is always derived from that stop, never typed in — and the ground's answer above
lists the event once it is published and listed. Remove the stop and the event leaves the
ground again. The event's own answer carries start_place and start_stop, so a client can say
Meets at Eboli crossodromo.
The grounds also travel in each region's offline POI pack. Riders meet them as the Practice grounds seeker and map layer on the phone (card, legality line, website, events, Route to it, Add stop, Save; offline from the region's pack) and as the Practice grounds tool, layer and card on the desktop.
Grounds riders add. A rider can report a ground the dataset lacks (a
rider signal of kind practice_ground). It is private until the rider shares it, and other riders
see it only once two riders have reported it independently, never inside a
private area or a military zone, and never beside a ground the dataset already
has. The grounds search returns these as rider_grounds beside the dataset's
grounds, labelled "reported by riders, not confirmed". They are not in the
offline packs or the catalogue.
Dirt passages
Every unpaved passage FastGIS knows, from OpenStreetMap, as a dataset you can download and query: the line of each passage and the facts the builder measured along it (length, unpaved share, surface and track grades, access for a motorcycle and for a car, gates, grades and climb), the joins to the road network, the groups the rider's gap ladder makes, and the baked vertical profile of every passage a plan may ride. Signed-in riders only, under the Open Database License (ODbL) 1.0.
Each region is one GeoPackage, rebuilt after the region's monthly build, and one Europe-wide file holds every published region (North Africa and Arabia included). Each file has eight layers:
| Layer | What it holds |
|---|---|
passages | One line per passage, its facts, region and osm_base |
paved_joins | The tarmac a passage's joins ride, one line per road edge |
gap_joins | Each hop from a dead end to the network (at most 250 m): its length, height step, steepest grade, water or wetland crossed, and the shorter alternative junction (alt_*) |
gap_groups | Passages the gap ladder (25–250 m) joins into one ride, in riding order |
paved_views | Passages joined over tarmac up to 2, 5 or 10 km |
barriers | The barrier nodes on the published passages |
profiles | The vertical profile of each passage a plan may ride: elevation (m) and road grade (%) every 25 m along the line a client draws, as JSON arrays, with the stretches' surface (surface_runs) and the elevation model they came from (src) |
region_meta | The build: OSM base, builder and schema versions, counts, grade source |
What is left out, as everywhere FastGIS publishes passages: a passage with a closed or doubtful gate, or one closed to motor traffic, and with it its joins, its barriers and any group it belongs to. No rider data is in the dataset: not your lifted gaps, not tagged or confirmed join candidates.
Regions built before the gap work (schema 4) have no gap_joins, gap_groups
or paved_joins rows yet, and those built before the profiles (schema 10) no
profiles rows; region_meta says which schema a file has.
A profile's samples sit at 0, spacing_m, 2 × spacing_m … and the last one
at the end of the last stretch in surface_runs, so the two arrays go straight
onto a distance axis. The elevations come from the same ladder as the grades —
the national 10 m model where it answers, Copernicus GLO-30 elsewhere — and
src names the one most of a passage's samples came from. The passage card
answers the same profile live at GET /dirt/passages/{key}?profile=1.
| The files: sizes, sha256, licence, credits | GET /dirt/datasets |
One region's GeoPackage (europe for all) | GET /dirt/datasets/{region} — Range honoured, so a download can resume |
| The passages as OGC API Features | GET /ogc/collections/{collection_id}/items with collection_id = dirt-passages, and bbox, region, limit (≤ 1000), offset |
| One passage | GET /ogc/collections/{collection_id}/items/{feature_id}, the id <region>:<passage_key> |
The collection reads the same files, so it answers exactly what the download
holds. In QGIS, add https://api.fastgis.eu/ogc as an OGC API Features
connection with your API key as the X-API-Key header, or open the downloaded
GeoPackage directly: the licence and credits are in its metadata.
From the desktop planner you need no key at all: the Library's published catalogue has a Datasets chip, and a dataset's panel downloads the GeoPackage, opens the collection and copies the address for QGIS — see the desktop client's Library.
Credit it as: © OpenStreetMap contributors, © Copernicus DEM GLO-30 (DLR/ESA), © Kartverket, © Lantmäteriet. Grades come from the national 10 m terrain models in Norway (Kartverket) and Sweden (Lantmäteriet) and from Copernicus GLO-30 elsewhere. Because the passages derive from OpenStreetMap, ODbL's share-alike applies to a database you build from them.
Taking data offline
Offline is tile-based. Tiles are 1°×1° SQLite files, one per cell, named after the cell's south-west corner.
| What the server has built | GET /grass/tiles/catalog |
| Curvature tile | GET /grass/tiles/curvature/{tile_id}?algorithm=total|bearing|radius |
| POI tile | GET /grass/tiles/poi/{tile_id} |
| MTB tile | GET /grass/tiles/mtb/{tile_id} |
Routing goes offline separately, as regional packs:
GET /grass/offline/catalog lists them and GET /grass/offline/manifest
describes what a client should download. The rider app wraps all of this — see
Offline data.
Imagery
GET /tiles/ortho/{z}/{x}/{y} serves orthophoto and satellite basemap tiles.
Coverage is per-country and configured server-side; a cell with no coverage
answers 404, which is the client's signal to fall back to another basemap.
Everything else
The API reference lists these datasets in full, with parameters and response shapes, under the mtb, friluft, beaches, curvature, dirt, tiles, offline and ortho tags of the API reference.
The sources endpoints above need no key and no subscription — licence terms
should never sit behind a paywall.
These endpoints cover the datasets we publish. For everything FastGIS consumes — the OpenStreetMap extracts behind routing and the basemap, the elevation models behind every profile, the national traffic feeds, and who has to be credited for each — see Data sources and credits, which is generated from the code that does the fetching.