IoBeacons / Developers / API reference

API reference

All 62 endpoints of the IoBeacons API, with examples you can copy and a console to try them with your own key.

Kept only in this browser tab and sent only to iobeacons.com. Space and Weather calls also work without a key. Create a key in Maps.

Base URLhttps://iobeacons.com/maps/api/v1
AuthAuthorization: Bearer iobm_...
LibrariesJavaScript · Python · OpenAPI 3.1

The basics

Set up a client

# JavaScript (Node 18+, Deno, Bun, browsers)
import { IoBeacons } from './iobeacons.mjs';
const io = new IoBeacons(process.env.IOBEACONS_API_KEY);

# Python 3.8+, standard library only
from iobeacons import IoBeacons
io = IoBeacons()   # reads IOBEACONS_API_KEY

Errors

Any failure answers with an HTTP status and {"error": "..."}, a sentence you can show to a person. 400 means something in the request needs fixing, 401 a missing or revoked key, 402 a plan limit, 404 not in this workspace, 429 too many calls.

Limits

Professional includes 100,000 calls a month and Business 1,000,000. Each answer carries X-Quota-Limit, X-Quota-Remaining and X-Quota-Period. A key can make up to 1,200 calls a minute.

From a web page

The API answers calls from any website (CORS). Keep keys on your server when the page is public.

Account

Check your key, plan and this month's usage.

GET/me#

Who this key belongs to

The workspace, plan and this month's API use for the key you sent. A good first call to check a key works.

curl "https://iobeacons.com/maps/api/v1/me" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
GET/usage#

Usage this month

Counts of maps, features, devices, zones, rules and sites, plus this month's map views, reports and API calls.

curl "https://iobeacons.com/maps/api/v1/usage" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it

Maps

Maps hold layers, a saved view and sharing settings.

GET/maps#

List maps

Every map in the workspace the key can see, newest change first.

curl "https://iobeacons.com/maps/api/v1/maps" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
POST/maps#

Create a map

Styles: streets, light, dark, satellite, terrain.

curl -X POST "https://iobeacons.com/maps/api/v1/maps" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Fleet yard","style":"streets","view":{"center":[-95.99,36.15],"zoom":11}}'
Try it
This changes data in your workspace.
GET/maps/{id}#

Get a map with its layers

The map, its saved view, every layer with its style, and share links if sharing is on.

ParameterInWhat it is
idpathIts id (a UUID).
curl "https://iobeacons.com/maps/api/v1/maps/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
PATCH/maps/{id}#

Change a map

Send only what changes: name, description, style, view, settings or visibility (private, team, link, public). Turning on link or public sharing returns share and embed links.

ParameterInWhat it is
idpathIts id (a UUID).
curl -X PATCH "https://iobeacons.com/maps/api/v1/maps/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Fleet yard (north)","visibility":"link"}'
Try it
This changes data in your workspace.
DELETE/maps/{id}#

Delete a map

Deletes the map, its layers and their features.

ParameterInWhat it is
idpathIts id (a UUID).
curl -X DELETE "https://iobeacons.com/maps/api/v1/maps/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
This changes data in your workspace.
POST/maps/{id}/duplicate#

Copy a map

Copies the map with all its layers and features.

ParameterInWhat it is
idpathIts id (a UUID).
curl -X POST "https://iobeacons.com/maps/api/v1/maps/{id}/duplicate" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
This changes data in your workspace.
POST/maps/{id}/upload#

Upload a file as a new layer

Send multipart/form-data with a file field (GeoJSON, KML, KMZ, GPX, CSV or a zipped shapefile) and an optional name. CSV rows with addresses are geocoded.

ParameterInWhat it is
idpathIts id (a UUID).
curl -X POST "https://iobeacons.com/maps/api/v1/maps/{id}/upload" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -F "file=@depots.csv" -F "name=Depots"
Try it
This changes data in your workspace.

Layers

Layers on a map: your own features or live catalog data.

POST/maps/{id}/layers#

Add a layer

kind "features" (default) is your own data. kind "catalog" with a catalog_key adds a live layer from the catalog, for example "radar" or "earthquakes".

ParameterInWhat it is
idpathThe map id.
curl -X POST "https://iobeacons.com/maps/api/v1/maps/{id}/layers" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Depots","style":{"color":"#2876ee","radius":6}}'
Try it
This changes data in your workspace.
PATCH/layers/{id}#

Change a layer

Name, visible, position, or style (color, opacity, width, radius, mode, field, label, popup, palette).

ParameterInWhat it is
idpathIts id (a UUID).
curl -X PATCH "https://iobeacons.com/maps/api/v1/layers/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Depots","visible":true,"style":{"color":"#d9781a"}}'
Try it
This changes data in your workspace.
DELETE/layers/{id}#

Delete a layer

ParameterInWhat it is
idpathIts id (a UUID).
curl -X DELETE "https://iobeacons.com/maps/api/v1/layers/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
This changes data in your workspace.
GET/layers/{id}/export.{format}#

Download a layer

The whole layer as a file.

ParameterInWhat it is
idpathIts id (a UUID).
formatpathgeojson, csv or kml
curl "https://iobeacons.com/maps/api/v1/layers/{id}/export.geojson" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -o download
Try it
GET/tiles/{layerId}/{z}/{x}/{y}.pbf#

Vector tiles

Mapbox Vector Tiles for large layers. Point MapLibre or Mapbox GL at https://iobeacons.com/maps/api/v1/tiles/{layerId}/{z}/{x}/{y}.pbf and send the key as a header (transformRequest).

ParameterInWhat it is
layerIdpathThe layer id.
zpath
xpath
ypath
curl "https://iobeacons.com/maps/api/v1/tiles/{layerId}/3/1/3.pbf" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -o download
Try it

Features

Points, lines and polygons inside a layer, as GeoJSON.

GET/layers/{id}/features#

Read features

A GeoJSON FeatureCollection. Each feature carries its id in properties._id. Up to 20,000 per call; truncated is true when there are more, so ask for a smaller bbox.

ParameterInWhat it is
idpathThe layer id.
bbox optionalqueryOnly what falls inside west,south,east,north (degrees).
curl "https://iobeacons.com/maps/api/v1/layers/{id}/features" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
POST/layers/{id}/features#

Add features

Send one GeoJSON Feature or a FeatureCollection. Returns the new ids.

ParameterInWhat it is
idpathThe layer id.
curl -X POST "https://iobeacons.com/maps/api/v1/layers/{id}/features" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"Feature","geometry":{"type":"Point","coordinates":[-95.99,36.15]},"properties":{"name":"Depot 4"}}'
Try it
This changes data in your workspace.
PATCH/features/{id}#

Change a feature

Send a new geometry, new properties, or both. Properties replace the old ones.

ParameterInWhat it is
idpathThe feature id (a number).
curl -X PATCH "https://iobeacons.com/maps/api/v1/features/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"properties":{"name":"Depot 4 (closed)"}}'
Try it
This changes data in your workspace.
DELETE/features/{id}#

Delete a feature

ParameterInWhat it is
idpathThe feature id (a number).
curl -X DELETE "https://iobeacons.com/maps/api/v1/features/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
This changes data in your workspace.

Sites

Places that matter to you. Reports and weather alerts use them.

GET/sites#

List sites

Your places of interest as GeoJSON points.

curl "https://iobeacons.com/maps/api/v1/sites" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
POST/sites#

Add a site

Give lon and lat, or an address to look up. An optional boundary polygon is used by weather alerts.

curl -X POST "https://iobeacons.com/maps/api/v1/sites" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Tulsa yard","address":"1 W 3rd St, Tulsa, OK"}'
Try it
This changes data in your workspace.
PATCH/sites/{id}#

Change a site

ParameterInWhat it is
idpathIts id (a UUID).
curl -X PATCH "https://iobeacons.com/maps/api/v1/sites/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Tulsa yard (main)"}'
Try it
This changes data in your workspace.
DELETE/sites/{id}#

Delete a site

ParameterInWhat it is
idpathIts id (a UUID).
curl -X DELETE "https://iobeacons.com/maps/api/v1/sites/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
This changes data in your workspace.

Zones

Geofences for enter and exit alerts.

GET/zones#

List zones

Geofences as GeoJSON polygons.

curl "https://iobeacons.com/maps/api/v1/zones" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
POST/zones#

Add a zone

Send a circle (lon, lat, radius_m) or a GeoJSON Polygon as geometry.

curl -X POST "https://iobeacons.com/maps/api/v1/zones" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Yard","circle":{"lon":-95.99,"lat":36.15,"radius_m":300}}'
Try it
This changes data in your workspace.
PATCH/zones/{id}#

Change a zone

ParameterInWhat it is
idpathIts id (a UUID).
curl -X PATCH "https://iobeacons.com/maps/api/v1/zones/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Main yard","color":"#d9781a"}'
Try it
This changes data in your workspace.
DELETE/zones/{id}#

Delete a zone

ParameterInWhat it is
idpathIts id (a UUID).
curl -X DELETE "https://iobeacons.com/maps/api/v1/zones/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
This changes data in your workspace.

Devices

Vehicles, trackers and sensors, and the positions they send.

GET/devices#

List devices

Every device with its last position, plus a FeatureCollection of those that have reported.

curl "https://iobeacons.com/maps/api/v1/devices" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
POST/devices#

Add a device

external_id is your own id for it. You can skip this step: sending positions for a new external id creates the device.

curl -X POST "https://iobeacons.com/maps/api/v1/devices" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Truck 12","external_id":"truck-12","kind":"vehicle"}'
Try it
This changes data in your workspace.
DELETE/devices/{id}#

Delete a device

ParameterInWhat it is
idpathIts id (a UUID).
curl -X DELETE "https://iobeacons.com/maps/api/v1/devices/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
This changes data in your workspace.
POST/devices/{ref}/positions#

Send positions

One fix, or { "positions": [...] } with up to 1,000 fixes and their times. The answer lists alerts the new positions set off.

ParameterInWhat it is
refpathThe device id or your external id.
curl -X POST "https://iobeacons.com/maps/api/v1/devices/truck-12/positions" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"lon":-95.99,"lat":36.15,"speed_mph":34,"heading":90}'
Try it
This changes data in your workspace.
GET/devices/{id}/track#

A device's trail

A GeoJSON LineString of recent positions.

ParameterInWhat it is
idpathIts id (a UUID).
hours optionalqueryHow far back, 1 to 168. Default 24.
curl "https://iobeacons.com/maps/api/v1/devices/{id}/track" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it

Alerts

Rules that watch zones, sites, devices and live feeds, and the alerts they raised.

GET/rules#

List alert rules

curl "https://iobeacons.com/maps/api/v1/rules" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
POST/rules#

Add an alert rule

Trigger types: zone_enter, zone_exit, offline, speed, nws_warning, earthquake. Channels: emails, sms (with country code) and https webhooks.

curl -X POST "https://iobeacons.com/maps/api/v1/rules" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Truck left the yard","trigger":{"type":"zone_exit","zone_id":"00000000-0000-0000-0000-000000000000"},"channels":{"emails":["ops@example.com"],"webhooks":["https://example.com/hooks/iobeacons"]}}'
Try it
This changes data in your workspace.
PATCH/rules/{id}#

Change an alert rule

ParameterInWhat it is
idpathIts id (a UUID).
curl -X PATCH "https://iobeacons.com/maps/api/v1/rules/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":false}'
Try it
This changes data in your workspace.
DELETE/rules/{id}#

Delete an alert rule

ParameterInWhat it is
idpathIts id (a UUID).
curl -X DELETE "https://iobeacons.com/maps/api/v1/rules/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
This changes data in your workspace.
GET/alerts#

Recent alerts

The last 100 alerts and how each was delivered.

curl "https://iobeacons.com/maps/api/v1/alerts" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it

Reports

Site Intelligence Reports for any point.

POST/reports#

Make a site report

Flood zone, weather warnings, earthquakes, nearby services and more for a point or a site_id.

curl -X POST "https://iobeacons.com/maps/api/v1/reports" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"lon":-95.99,"lat":36.15,"radius_mi":1}'
Try it
This changes data in your workspace.
GET/reports#

List reports

curl "https://iobeacons.com/maps/api/v1/reports" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
GET/reports/{id}#

Get a report

ParameterInWhat it is
idpathIts id (a UUID).
curl "https://iobeacons.com/maps/api/v1/reports/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
GET/reports/{id}/pdf#

Download a report as PDF

ParameterInWhat it is
idpathIts id (a UUID).
curl "https://iobeacons.com/maps/api/v1/reports/{id}/pdf" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -o download
Try it

Catalog

Live public data layers and address search.

GET/catalog#

List live data layers

Ready-made layers (weather warnings, radar, earthquakes, wildfires, flood zones and more), with which your plan includes.

curl "https://iobeacons.com/maps/api/v1/catalog" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
GET/catalog/{key}/data#

Read a live data layer

GeoJSON for vector catalog layers, or tile details for raster ones.

ParameterInWhat it is
keypath
bbox optionalqueryOnly what falls inside west,south,east,north (degrees).
curl "https://iobeacons.com/maps/api/v1/catalog/earthquakes/data" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
GET/geocode#

Look up an address

ParameterInWhat it is
qqueryAn address or place name.
curl "https://iobeacons.com/maps/api/v1/geocode" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it

Space

Satellites and debris: orbital elements, live positions and ground tracks. Try these without a key.

GET/space#

List satellite groups

Stations, weather, Earth observation, GPS, science, Starlink, every active satellite, recent launches and three debris fields.

curl "https://iobeacons.com/maps/api/v1/space" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it works without a key
GET/space/{group}#

Orbital elements for a group

Two-line elements (TLE) from CelesTrak, refreshed every few hours.

ParameterInWhat it is
grouppath
curl "https://iobeacons.com/maps/api/v1/space/stations" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it works without a key
GET/space/{group}/positions#

Where a whole group is

Every object in the group as GeoJSON points with altitude and speed.

ParameterInWhat it is
grouppath
time optionalqueryA moment within 30 days of now, as an ISO date. Default: now.
curl "https://iobeacons.com/maps/api/v1/space/stations/positions" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it works without a key
GET/space/objects/{norad}/position#

Where one object is

Longitude, latitude, altitude (km) and speed (km/s), worked out from the latest elements.

ParameterInWhat it is
noradpathNORAD catalogue number.
time optionalqueryA moment within 30 days of now, as an ISO date. Default: now.
curl "https://iobeacons.com/maps/api/v1/space/objects/25544/position" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it works without a key
GET/space/objects/{norad}/track#

Ground track

The path over the ground as a GeoJSON MultiLineString, split at the date line.

ParameterInWhat it is
noradpath
time optionalqueryA moment within 30 days of now, as an ISO date. Default: now.
minutes optionalqueryHow long a path, 1 to 1440. Default: one orbit.
step optionalquerySeconds between points, 10 to 600. Default 60.
curl "https://iobeacons.com/maps/api/v1/space/objects/25544/track" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it works without a key
GET/space/objects/{norad}/heard#

Recordings by ground stations

Recent passes of this object recorded by SatNOGS, an open network of volunteer ground stations, and checked as good: when, which station and where, frequency, mode, decoded packets, and links to the recording.

ParameterInWhat it is
noradpathNORAD catalogue number.
curl "https://iobeacons.com/maps/api/v1/space/objects/25544/heard" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it works without a key
GET/space/check/iss#

Check our positions

Our ISS position next to an independent public tracker at the same moment, and how far apart they are. agrees is true within 25 km.

curl "https://iobeacons.com/maps/api/v1/space/check/iss" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it works without a key
GET/space/info/{norad}#

Catalogue record

Owner, launch date and site, type, status, orbit and radar size from the CelesTrak satellite catalogue.

ParameterInWhat it is
noradpath
curl "https://iobeacons.com/maps/api/v1/space/info/25544" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it works without a key

Weather

Moving radar and Doppler winds. Try these without a key.

GET/weather/radar-frames#

Radar loop frames

Tile URLs for each frame of the last hour, oldest first, ready for a map library.

ParameterInWhat it is
source optionalqueryus (high resolution, 5-minute steps) or world (10-minute steps). Default us.
curl "https://iobeacons.com/maps/api/v1/weather/radar-frames" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it works without a key
GET/weather/doppler#

Doppler winds near a point

The nearest NEXRAD radar within about 460 km and tile URLs for its wind velocity.

ParameterInWhat it is
lonqueryLongitude.
latqueryLatitude.
curl "https://iobeacons.com/maps/api/v1/weather/doppler" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it works without a key

Notes

Notes pinned to places, satellites and maps, shared with your team.

GET/notes#

List notes

ParameterInWhat it is
map_id optionalqueryOnly notes on this map.
norad optionalqueryOnly notes about this satellite.
curl "https://iobeacons.com/maps/api/v1/notes" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
POST/notes#

Add a note

A note pins to a place (lng, lat), a satellite (norad) or a whole map. Add map_id to show it on a map.

curl -X POST "https://iobeacons.com/maps/api/v1/notes" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"body":"Gate 3 floods after heavy rain.","target":{"kind":"place","lng":-95.99,"lat":36.15}}'
Try it
This changes data in your workspace.
PATCH/notes/{id}#

Change a note

An API key can change notes written with an API key.

ParameterInWhat it is
idpathIts id (a UUID).
curl -X PATCH "https://iobeacons.com/maps/api/v1/notes/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"body":"Gate 3 floods after heavy rain. Use gate 4."}'
Try it
This changes data in your workspace.
DELETE/notes/{id}#

Delete a note

ParameterInWhat it is
idpathIts id (a UUID).
curl -X DELETE "https://iobeacons.com/maps/api/v1/notes/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
This changes data in your workspace.

Findings

Saved views with a note, which you can share by link.

GET/findings#

List findings

curl "https://iobeacons.com/maps/api/v1/findings" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
POST/findings#

Save a finding

A saved view with a note. kind "map" (center, zoom, pitch, bearing, mapId) or "orbit" (norad, time, camera). With share: true the answer includes a link anyone can open.

curl -X POST "https://iobeacons.com/maps/api/v1/findings" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Storm cell over the north yard","note":"Moving east at 30 mph.","kind":"map","view":{"center":[-95.99,36.15],"zoom":9},"share":true}'
Try it
This changes data in your workspace.
PATCH/findings/{id}#

Change a finding

ParameterInWhat it is
idpathIts id (a UUID).
curl -X PATCH "https://iobeacons.com/maps/api/v1/findings/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"share":false}'
Try it
This changes data in your workspace.
DELETE/findings/{id}#

Delete a finding

ParameterInWhat it is
idpathIts id (a UUID).
curl -X DELETE "https://iobeacons.com/maps/api/v1/findings/{id}" \
  -H "Authorization: Bearer $IOBEACONS_API_KEY"
Try it
This changes data in your workspace.

Need something the API does not cover?

Our engineers build custom feeds and integrations. Tell us what you are connecting.