API

The region list is on the hub. Everything else is served by each region’s own site, at the same paths.

GET /v1/regions

Every active region and region group, with its MeshMapper code, slug, name, URL, bounding box [west, south, east, north], centre, default radio preset and group. No sign-in; CORS is open; cached for five minutes and sent with an ETag.

curl https://meshsonar.com/v1/regions

{ "regions": [ { "code": "XXX", "slug": "xxx", "name": "…", "status": "active",
                 "url": "https://xxx.meshsonar.com", "bbox": [w, s, e, n] | null,
                 "centroid": { "lat": 0, "lon": 0 } | null, "default_preset": { … } | null,
                 "group": "slug" | null } ],
  "groups":  [ { "code": "…", "slug": "…", "name": "…", "url": "…", "members": ["XXX"], "bbox": …, "centroid": … } ] }

A region’s public endpoints

At https://<slug>.meshsonar.com/api/cmh/<name>. Errors are {error} with 400, 401, 403, 404, 409 or 429 (with Retry-After). Public endpoints are rate limited to 120 requests a minute per address.

EndpointAuthRequest and response
site-confignoneGET → {viewerGate, driverRegistration, appLinks}
public-coveragenoneGET [?since=ISO] → {cellDeg, cells[], totals, asOf}: measured squares, drive ends trimmed, flagged drives excluded
public-statsnoneGET → {drivers, drives, pings, heardPct, km, repeatersHeard, lastDriveAt}
leaderboardnoneGET ?period=30d|all → {period, rows[]}: opt-in drivers, callsign only

Uploads and account endpoints are in the drive format.