SensorThings API Extractor avatar

SensorThings API Extractor

Pricing

from $0.35 / 1,000 records

Go to Apify Store
SensorThings API Extractor

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

Datamule

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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:

ModeWhat 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
thingsmonitored asset — id, name, description, properties, and its Location's coordinates (Locations auto-expanded)
datastreamsmeasurement series — name, observation type, unit of measurement, observed area, phenomenon/result time + Sensor / ObservedProperty / Thing links
discoveryinstance fingerprint — available entity sets, declared conformance classes, server settings

The SensorThings entity graph is

Things → Locations → Datastreams (Sensor, ObservedProperty) → Observations
. Run discovery first to fingerprint an instance, things or datastreams to map what it monitors, then observations (optionally scoped to a single datastreamId) 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 an observedArea, an Observation without resultQuality or parameters → that column is simply null, never a crash.
  • @iot.nextLink cursor pagination. Large collections are returned page by page; the actor follows the server's cursor automatically up to your global maxRecords cap.
  • Full OData query surface. Pass $filter, $expand, $select, $orderby straight through — e.g. $filter=result gt 0, $orderby=phenomenonTime desc, $expand=Datastream,FeatureOfInterest.
  • result is 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] coordinates column, with the full GeoJSON kept in geometry / _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.