Data & Sources
Last reviewed: 2026-09-10
The travel planner combines open data (OpenStreetMap, Wikidata, public-transport timetables) with the trail route, which the Stockholm Archipelago Trail owns. Every object states its source, licence and freshness, and carries a persistent identifier — so it can be verified, reused, and corrected at the right place.
Map & data attribution
Map data & base-map tiles © OpenStreetMap contributors, licensed ODbL 1.0; tiles built with Protomaps. Places from OpenStreetMap (ODbL) and Wikidata (CC0). Ferry timetables via Trafiklab / Waxholmsbolaget. Trail route © Stockholm Archipelago Trail, licensed CC BY 4.0.
Full per-source licences and links in the table below.
Upstream sources
- OpenStreetMap — places, islands, reserves
- Wikidata & Commons — names, photos, links
- Trafiklab — ferry timetables
- Hjärtstartarregistret — AEDs
- grillplatser.nu — firepits
- SAT trail master — the route (we own this)
This planner
- Filters to the trail & cross-links sources
- Mints persistent identifiers sat:<type>:<uid>
- Tracks per-field provenance & freshness
- Versions the route, archives every change
Published
- The map — this app
- /data/… — open files (GeoJSON, JSON-LD)
- /api/objects/<id> — object resolver
- Permalinks — /?id=<satId> (canonical share form, any object type), or typed /?poi= / /?section= / /?pier= / /?vessel=
1Who owns what
We are the source of truth for the trail itself, and a consumer / re-publisher of everything else. Fix data at its source and the fix benefits every map that uses it.
| Dataset | Source of truth | Licence | Our role |
|---|---|---|---|
Trail route + stages | Stockholm Archipelago Trail | CC BY 4.0 | Source of truth |
Places (POIs) | OpenStreetMap | ODbL 1.0 | Consumer / re-publisher |
Names, photos, cross-links | Wikidata / Wikimedia Commons | CC0 / per photo | Consumer |
Defibrillators (AED) | Sveriges Hjärtstartarregister | Registry API terms | Consumer |
Firepits (grillplatser) | grillplatser.nu | CC0 / CC BY / CC BY-SA | Consumer |
Ferry timetables | Waxholmsbolaget / Trafiklab | Open transport data | Consumer |
Base map | OpenStreetMap (via Protomaps) | ODbL 1.0 | Self-hosted tiles |
Problem reports | This planner | Reviewed public fields | Source of truth |
Routing, reachability, reliability scores | This planner | — | Derived / computed |
2Sources & attribution
| Source | What we use it for | Licence | Updated |
|---|---|---|---|
The trail route stockholmarchipelagotrail.com ↗ |
The hiking route geometry for each stage of the Stockholm Archipelago Trail. | CC BY 4.0 © Stockholm Archipelago Trail | On trail updates |
OpenStreetMap openstreetmap.org/copyright ↗ |
Points of interest (food, water, toilets, shops, viewpoints, shelters, …), island outlines, and nature-reserve areas. | ODbL 1.0 © OpenStreetMap contributors | On demand + regular re-publish |
Trail surface & difficulty metadata
openstreetmap.org/copyright ↗
|
Surface type, difficulty (SAC scale), trail visibility, width and trail photos for each stage, derived from the mapped Stockholm Archipelago Trail ways in OpenStreetMap. | ODbL 1.0 © OpenStreetMap contributors · photos per Wikimedia Commons licence | On trail rebuild |
Wikidata wikidata.org ↗ |
Multilingual place names, photographs, and links to external databases. | CC0 1.0 public-domain dedication | Weekly |
Wikimedia Commons commons.wikimedia.org ↗ |
Photographs on place cards, and hero photos in the pier modals. Pier photos were matched stop-by-stop via Wikidata’s brygga class (Q133867301 ↗) and the salgo60 ferry-stops dataset ↗. | Per image author + licence credited in the app | With POI / pier refresh |
Sveriges Hjärtstartarregister hjartstartarregistret.se ↗ |
Defibrillator (AED) locations and their availability hours shown on the map. | Registry API terms © Swedish Resuscitation Council | Daily |
grillplatser.nu grillplatser.nu ↗ |
Firepit / barbecue sites — position, facilities and photos. grillplatser.nu is the source of truth; each firepit links back to its page there to view & update at the source. | CC0 / CC BY / CC BY-SA © grillplatser.nu | On POI refresh |
Waxholmsbolaget ferry timetables trafiklab.se ↗ |
Departure times, routes, and seasonal calendars used to plan the boat legs. | Open transport data via Trafiklab / Samtrafiken (GTFS) | Per season |
ResRobot (Trafiklab) trafiklab.se — ResRobot ↗ |
Used to detect departures that require advance booking (call-to-order lines). | Open transport data via Trafiklab | With timetables |
SAT Passport locations /data/sat-passport-locations.json ↗ |
Which places sell the SAT hiking passport and where it can be stamped — flagged on the matching place cards. A thin membership list (identity + role only); join to OpenStreetMap / Wikidata for names & coordinates. Seeded from salgo60 ↗. | CC BY 4.0 membership © SAT; identity ODbL / CC0 | On data refresh |
Protomaps (base map) protomaps.com ↗ |
The map background (base tiles, hillshade, contours) — self-hosted vector tiles, built from OpenStreetMap data and served from our own storage. | ODbL 1.0 © OpenStreetMap contributors; tiles built with Protomaps | On tile rebuild |
Per-place provenance in the app: every place card shows its own “last updated” date, links to the source object and its full edit history, and carries a persistent identifier with a shareable permalink.
3Persistent identifiers
Every object this planner publishes carries a permanent identifier:
Examples: sat:trail:daesy (the trail itself), sat:section:3hz5y (a stage), sat:poi:sjwtd (a place), sat:pier:25njf (a ferry pier), sat:vessel:3kjzv (a ferry vessel).
- Frozen. The uid is opaque, minted once, and never changes or gets reused — even if the object’s name, slug or upstream database id changes.
- Old identifiers resolve forever. Every external identifier an object has ever had (OpenStreetMap id, Wikidata QID, …) is kept in an append-only concordance. Look any of them up and you reach the current object.
- Resolvable. The canonical web resolution of an identifier is https://<this host>/api/objects/<id> — a stable JSON record with links to the live data, the upstream sources and the archive.
- Tombstones, not dead links. When an object leaves the dataset its identifier keeps resolving (HTTP 410) to a record of what it was and which identifiers it carried.
- No lock-in. The identifier is the compact string, not a URL — it stays valid if this service moves hosts. The concordance table is CC0 so anyone can re-create the mapping.
4Open data: the trail — we own the master
The trail route, its stages and curated descriptions — the one dataset where we are the source of truth. The trail is a first-class object (sat:trail:daesy), published as GeoJSON-LD following the Swedish national specification for trails as linked data ↗ with schema.org vocabulary: name, activity category, total length, elevation, the managing organisation, and an ordered itinerary of all stages in the official north-to-south order.
Endpoints
| Endpoint | Contents |
|---|---|
| /data/trail.jsonld | The whole trail as one GeoJSON-LD document (odta:Trail + schema.org): identity, category, total length, elevation, provider organisation, ordered stage itinerary, and the full route geometry (stages + connector legs). |
| /data/catalog.jsonld | DCAT-AP-SE catalogue describing this dataset — harvestable by Sveriges dataportal ↗ and other DCAT aggregators (publisher, licence, theme, spatial extent, distributions, contact point). |
| /data/sections-index.json | All stages: satId, uid, slug, version, routeVersion, updated, orderInTrail, distance, difficulty, blurb. |
| /data/geojson/islands/<slug>.geojson | Current route per stage. Self-describing: a top-level metadata block and the route feature’s properties both carry satId / version / routeVersion. |
| /data/history/sections/<slug>/index.json | List of archived route versions for a stage. |
| …/route-v<n>.geojson | A specific past route version — cite an exact route, not just a number. |
| …/route-v<n>.gpx | The same route version as a downloadable GPX track — washed geometry with elevation, for GPS devices and apps. Carries satId / version / routeVersion in its metadata. |
| /api/objects/<satId> | Machine-readable record for one stage: name, description, length, version/routeVersion, licence, and links to the live GeoJSON, the archive and the version-pinned route (GeoJSON + GPX). Accepts sat:section:<uid>, the bare uid or the slug. sat:trail:<uid> returns the full trail document. |
| /?id=<satId> or /?section=<ref> | Permalink — opens the stage in the app. The share button copies the canonical /?id=sat:section:<uid> (one form for every object type, survives sharing via Facebook/social). The typed /?section= also works and accepts slug, uid or sat:section:<uid>. |
Stage identity & versioning
| Field | Meaning |
|---|---|
| satId | Permanent identity, sat:section:<uid>. Never changes — cite this. |
| slug | Human handle used in URLs and filenames (e.g. orno). May change; the satId never does. |
| version | Bumps on any change — description or route. |
| routeVersion | Bumps only when the walked geometry changes; keys the route archive. |
| orderInTrail | The stage’s position in the official north-to-south order (1–20). |
Trail data © Stockholm Archipelago Trail, licensed CC BY 4.0 — attribute when reusing. Endpoints are best-effort and may change — open an issue if you build on them.
5Open data: places — upstream owns the master
An attributed projection of upstream open data, filtered to the trail. OpenStreetMap, Wikidata and the registries are the source of truth — consume and correct it there. Use these endpoints for permalinks, provenance and a trail-scoped extract.
| Endpoint | Contents | Licence |
|---|---|---|
| /data/geojson/pois.geojson | Every place. Per feature: source, OpenStreetMap id + version/changeset, Wikidata QID, sameAs, derived reliability. Top-level metadata (licence, attribution, generated-at). | ODbL / CC0 |
| /data/history/pois/index.json …/<YYYY-MM-DD>.geojson | Dated snapshots of the place extract, written only when the data changes. | ODbL / CC0 |
| /api/aed | Defibrillators from Sveriges Hjärtstartarregister (daily). Each carries shr:<id> and, where cross-referenced in OpenStreetMap, that node’s verified position. | Registry API terms |
| /data/geojson/reserves.geojson | Nature-reserve outlines from OpenStreetMap, filtered to those the trail passes through. | ODbL 1.0 |
| /data/geojson/poi-concordance.json | Concordance table: every known external identifier (OpenStreetMap id, Wikidata QID, …) → the place’s permanent sat:poi:<uid>. Re-published on every data build. | CC0 |
| /data/pois-identity.json | The identity register itself: per place, its frozen uid, all identifiers ever associated with it (append-only), status and first-seen date. | CC0 |
| /data/piers-identity.json | Ferry-pier identity register: every pier and mainland hub with its frozen sat:pier:<uid>, GTFS stop-ids and slug history (append-only — GTFS ids rotate between exports; old references resolve forever). /api/objects/sat:pier:<uid> returns the record. | CC0 |
| /data/vessels-identity.json | Ferry-vessel identity register: every named vessel with its frozen sat:vessel:<uid>, Wikidata QID and GTFS-RT vehicle-id history (append-only — vehicle-ids rotate; old references resolve forever). /api/objects/sat:vessel:<uid> returns the record (schema.org Vehicle, with the Wikidata QID as sameAs). | CC0 |
| /api/objects/<id> | Machine-readable record for one place (JSON, open CORS, light JSON-LD). Accepts the canonical sat:poi:<uid> or any identifier the place has ever had — old ids resolve forever and the response normalises to the canonical one. A place that has left the dataset returns a tombstone (HTTP 410) with its identity and known identifiers, never a dead link. | — |
| /?id=<satId> or /?pier=<ref> | Permalink — opens the pier panel (departure board, photo). The pier’s share button copies the canonical /?id=sat:pier:<uid> (one form for every object type, survives sharing via Facebook/social). The typed /?pier= also works and accepts the slug or sat:pier:<uid>. | — |
| /?id=<satId> or /?vessel=<ref> | Permalink — focuses the vessel: opens its live-position popup if it is sailing now, otherwise an info card. The /?vessel= form accepts the sat:vessel:<uid>, the raw GTFS-RT vehicle-id or the Wikidata QID. | — |
| /?id=<satId> or /?poi=<id> | Permalink — opens the place in the app. The share button copies the canonical /?id=sat:poi:<uid> (one form for every object type, survives sharing via Facebook/social). The typed /?poi= also works; id is the canonical sat:poi:<uid>, and previous identifiers (e.g. osm:node:2550378999, wikidata:Q…, firepits’ grillplatser:<gid>) keep working. | — |
6Open reports & trail information
Published problem reports, warnings and trail information are available without an account or API key. Each has a permanent sat:report:<uid> identifier, just like trails, stages, places and piers. Only reviewed, explicitly published fields are included. Raw submissions, contact details, attachments, private tracking tokens and internal notes are excluded.
Choose how to access reports
| Access | URL | What you get |
|---|---|---|
| Browse open reports | /report?status=open | A public list of currently open, published reports. |
| List reports as JSON | /api/reports?status=open&limit=100 | A Collection with an items array and a next URL. Follow next until it is null to read all pages. |
| Fetch one report | /api/objects/sat:report:d3vej | An example object record with its public title, note, status, coordinates, timestamps and related SAT identifiers in about. Replace d3vej with the report’s UID. links.permalink opens its public status page. |
| Add reports to a map | /api/reports/map | A GeoJSON FeatureCollection of current published markers with valid coordinates. Point coordinates are [longitude, latitude]. A report that covers an area also carries it as a GeoJSON Polygon or MultiPolygon in properties.area; the point is then an anchor inside that area. Add ?geometry=area to receive the area itself as each feature’s geometry (instead of in properties.area), for tools such as uMap or QGIS. This endpoint does not include the archive or reports without a position. |
JSON list filters and pagination
status=openis the default. Usestatus=resolvedfor closed or expired information, orstatus=allfor all published records. Unpublished reports and spam are excluded in every mode.limit: 1–100 records per page (default 50).offset: starting position (default 0). Results are ordered newest first.category=treefilters by category; use category values returned by the API.object=sat:pier:<uid>filters by a linked pier. Linkedsat:poi:<uid>andsat:section:<uid>identifiers are also supported.bbox=west,south,east,northfilters by coordinates in decimal degrees and includes reports whose area intersects the box, for example /api/reports?bbox=18,58,20,60.lang=enrequests English public text in the JSON list, with Swedish fallback where a translation is missing. The default is Swedish.
Example request:
curl 'https://map.stockholmarchipelagotrail.com/api/reports?status=open&limit=100&lang=en'
The JSON records use received, in_progress and resolved for status, and error or information for reportType. GeoJSON uses source field names such as report_type and Swedish status values such as pagaende; match records using their shared id.
Reports that cover an area include area (GeoJSON, WGS84) and a schema.org spatialCoverage with a GeoShape box (south west north east). How much the report affects visitors is given in impact: unknown, passable, difficult or blocked — the map’s colours and hatching are only a presentation of these fields.
To open an active report’s tooltip on the main map, use /sv?mode=discover&report=sat:report:<uid>&c=<latitude>,<longitude>&z=15. A marker is available only while the report is published and active. Resolved reports can still have a public status page.
Freshness and integration
These read-only endpoints support cross-origin browser requests (CORS). Publication changes are served without republishing the whole map. GeoJSON has a short edge cache of up to five seconds; the public map normally refreshes it every ten seconds. The JSON list is served with Cache-Control: no-store. Avoid excessive polling, handle HTTP 429 by backing off, and use the GeoJSON endpoint when you need the current map markers.
endDate / end_date controls when information leaves the map or when a warning needs review. It is not a statement that a physical route change ends on that date. A report that is no longer published is not available through the open object API; a previously valid URL may then return HTTP 404.
Found an error?
Most place data lives in OpenStreetMap — edit it there and the fix flows back on the next refresh, benefiting every map that uses OpenStreetMap. For routing or trail issues, use “Report a problem” in the app. A private tracking link lets the reporter follow their submission before publication; it is separate from the open dataset.