Weather — entry 017 of 31

openSenseMap

Verified Jul 2026

openSenseMap is the open, non-profit citizen-science platform behind the University of Munster's senseBox project, serving live and historical readings from thousands of crowdsourced environmental sensor stations worldwide, covering not just temperature/humidity but also particulate matter, noise and other phenomena. Reading data is fully open and keyless (accounts are only needed to register or post data from your own senseBox), and the full historical archive is separately mirrored on an archive subdomain.

openSenseMap serves live and historical readings from crowdsourced senseBox environmental stations; fetch a single station by ID for its full sensor list with live values, or query the `/boxes` collection scoped by a bounding box.

no-keyopen-sourceair-qualityglobal
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSON, GeoJSON, CSVResponses can be requested as JSON or GeoJSON or CSV.

GreatAPIs Score

Score94out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs14/20Documentation URL provided
Formats15/15Supports 3 response formats
Freshness20/20Verified within 6 months

Embed this badge

Scored 94 on greatapis.com
<a href="https://greatapis.com/api/opensensemap/"><img src="https://greatapis.com/badge/opensensemap.svg" alt="Scored 94 on greatapis.com"></a>

Auth quickstart

  1. No API key required for reads — requests are public and keyless (an account is only needed to register or post data from your own senseBox).
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Live readings for a single senseBox

GEThttps://api.opensensemap.org/boxes/5c4208271b7ca800198cbe90

200 application/json; charset=utf-8

{
  "_id": "5c4208271b7ca800198cbe90",
  "name": "Geigenbaumeister Kehnen #1",
  "exposure": "indoor",
  "model": "homeV2Wifi",
  "currentLocation": {
    "type": "Point",
    "coordinates": [7.217819, 51.470113],
    "timestamp": "2019-01-18T17:12:01.018Z"
  },
  "sensors": [
    {
      "title": "Temperatur",
      "unit": "\u00b0C",
      "sensorType": "HDC1080",
      "_id": "5c4208271b7ca800198cbe92",
      "lastMeasurement": { "createdAt": "2026-07-26T03:13:09.564Z", "value": "22.66" }
    },
    {
      "title": "rel. Luftfeuchte",
      "unit": "%",
      "sensorType": "HDC1080",
      "_id": "5c4208271b7ca800198cbe91",
      "lastMeasurement": { "createdAt": "2026-07-26T03:13:09.564Z", "value": "63.43" }
    }
  ],
  "lastMeasurementAt": "2026-07-26T03:13:09.564Z",
  "weblink": "http://www.geigenbaumeisterkehnen.de/",
  "description": "Zur \u00dcberwachung der Feuchtigkeit in der Werkstatt"
}

Developer reference

Base URLhttps://api.opensensemap.org

Gotchas & limits

  • `limit` on the `/boxes` list endpoint is effectively ignored: a live `GET /boxes?limit=1` streamed past 10MB and still hadn't finished after 15 seconds — scope list queries with `bbox=<west,south,east,north>` instead of relying on `limit` to keep the response small
  • The `/boxes` list endpoint returns each sensor's `lastMeasurement` as a bare measurement-ID string, not a value — fetching the same box individually via `/boxes/:boxId` (as above) returns the full `{ createdAt, value }` object instead, confirmed live for the same station
  • `/stats` returns global counts as a bare 3-element array with no keys — `[boxCount, measurementCount, measurementsInLastMinute]` — the third element is a live throughput figure, not a sensor total, and the field order is documented only in the API docs, never in the response itself
  • Sensor `title`/`unit` strings are free text entered by whoever registered the senseBox, not a controlled vocabulary — German labels like "Temperatur" and "rel. Luftfeuchte" turn up alongside English ones on live stations, so don't match on title text across boxes