Bridges, devices, areas of interest, jobs, kinds — one HTTP surface for satellite, IoT, and field-team intelligence. Designed for engineers who need to track change in hard-to-reach places.
// API Surfaces
Each surface is independently versioned, fully documented in the reference below,
and unifies the customer flow with the demo flow — same endpoints, same shapes,
differing only by a synthetic flag.
Bridges and devices — register a LoRaWAN gateway or a synthetic emulator process. Soft-delete cascades to children. Polling reconciliation included.
Bridges + Devices →Areas of interest as PostGIS GEOGRAPHY polygons. Tenant-scoped, indexed for spatial queries, ready for adapter wiring.
Polygons + Tenants →Submit satellite jobs, poll status, stream events, cancel. Workers consume off SQS and call back via HMAC-signed internal endpoints.
Submit + Poll →The canonical sensor catalog — ~50 kinds covering temperature, CO2, GPS, valve_state, camera_status, and more. Public, no auth required.
Catalog →// Quickstart
Every protected endpoint accepts an Ed25519-signed JWT (user flow) or a SHA-256
service-account key (server flow). Below: a synthetic-fleet polling call against
api.dev.fieldwatch.earth.
# Polling reconciliation: list synthetic bridges since timestamp.
curl -sS \
-H "Authorization: Bearer $FWAI_API_KEY" \
"https://api.dev.fieldwatch.earth/v1/bridges?synthetic=true&since=2026-04-27T00:00:00Z"
// Polling reconciliation in vanilla fetch.
const r = await fetch(
"https://api.dev.fieldwatch.earth/v1/bridges?synthetic=true",
{ headers: { Authorization: `Bearer ${process.env.FWAI_API_KEY}` } }
);
const { items } = await r.json();
# Polling reconciliation in plain requests.
import os, requests
r = requests.get(
"https://api.dev.fieldwatch.earth/v1/bridges",
params={"synthetic": "true"},
headers={"Authorization": f"Bearer {os.environ['FWAI_API_KEY']}"},
)
items = r.json()["items"]
Need a key? Service-account keys are issued by the platform team — see Authentication in the reference.