SensorThings API Extractor
Pricing
from $0.35 / 1,000 records
SensorThings API Extractor
Point at ANY OGC SensorThings API v1.1 instance (FROST-Server, GOST, SensorUp and thousands of air-quality, smart-city and research deployments) and get flat sensor rows — observations, things with coordinates, datastreams with units — plus raw JSON. @iot.nextLink paging, OData filters. Pay per row.
Pricing
from $0.35 / 1,000 records
Rating
0.0
(0)
Developer
Datamule
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Point at any OGC SensorThings API v1.1 instance and get clean, flat sensor rows — plus the lossless raw JSON of every entity. One actor, the entire open sensor-data world.
The OGC SensorThings API (OGC 15-078r6 / 18-088) is the open standard for Internet-of-Things and environmental-sensor data on the web. Every conforming deployment — no matter what server it runs (FROST-Server, GOST, SensorUp, or a custom stack) — answers the identical RESTful JSON grammar over the same entity graph, and anonymous read is the norm (publishing sensor data is the protocol's purpose). So this single actor works against every SensorThings instance on Earth — air-quality networks, smart-city platforms, government monitoring, university research. No per-instance scraper, no host enumeration — just the base URL.
What you can extract
Pick a mode and point sources at one or more SensorThings base URLs:
| Mode | What you get (one row per…) |
|---|---|
| observations (default) | sensor reading — @iot.id, phenomenon time, result time, result (any type), result quality, parameters, valid time + Datastream / FeatureOfInterest links |
| things | monitored asset — id, name, description, properties, and its Location's coordinates (Locations auto-expanded) |
| datastreams | measurement series — name, observation type, unit of measurement, observed area, phenomenon/result time + Sensor / ObservedProperty / Thing links |
| discovery | instance fingerprint — available entity sets, declared conformance classes, server settings |
The SensorThings entity graph is
Things → Locations → Datastreams → (Sensor, ObservedProperty) → ObservationsdatastreamId) to pull
the readings.
Why one actor covers thousands of sources
The wire format is uniform, but installs populate different optional fields — and this runner handles all of them:
- Every field is read by key presence. A Thing without
properties, a Datastream without anobservedArea, an Observation withoutresultQualityorparameters→ that column is simplynull, never a crash. @iot.nextLinkcursor pagination. Large collections are returned page by page; the actor follows the server's cursor automatically up to your globalmaxRecordscap.- Full OData query surface. Pass
$filter,$expand,$select,$orderbystraight through — e.g.$filter=result gt 0,$orderby=phenomenonTime desc,$expand=Datastream,FeatureOfInterest. resultis any type. A reading may be a number, a string, a boolean, an array, or a complex object (OM_ComplexObservation) — it is passed through verbatim.- Coordinates promoted. A Thing's Point location and a Datastream's observed area are promoted
to a clean
[lon, lat]coordinatescolumn, with the full GeoJSON kept ingeometry/_raw.
Example input
{"sources": ["https://iot.hamburg.de/v1.1"],"mode": "observations","$orderby": "phenomenonTime desc","maxRecords": 1000}
Map an instance's assets instead:
{"sources": ["https://airquality-frost.k8s.ilt-dmz.iosb.fraunhofer.de/v1.1"],"mode": "things"}
Output
Every row is flat and fully nullable, with the same column set across all modes (unused columns
are null), plus a lossless _raw copy of the source entity and _source / _mode / _entity
provenance. Results stream to the dataset and export as JSON, CSV, Excel, or via the API.
Resilience & honesty
- A reachable instance with no matching rows → 0 records, clean success. Nothing is ever fabricated.
- An unreachable / DNS-failed host, an auth gate (401/403), or a non-SensorThings body is skipped with a warning and the batch continues; a run where every source is skipped fails fast so you know your input was wrong rather than getting a silent empty result.
- No authentication is required for public instances. An optional bearer token / extra headers can be supplied for gated deployments — they are never logged.
Pricing
Pay-per-event: you are charged per record emitted to the dataset. Use maxRecords (and, for
observations, datastreamId or a $filter) to bound cost precisely.