Reference
HTTP API reference
Every route the Atlas API serves — checked against the router on every test run.
Basics #
Routes live at the root of the Atlas API (the examples use https://atlas-api-dusky.vercel.app). Points are WGS84; most take lat,lng or separate lat/lng params. Send a user token as Authorization: Bearer … — see Authentication.
Errors come back with a 4xx or 5xx status and a message: 400 for a missing or invalid parameter or a point outside coverage, 401 when a route needs you signed in, 404 when nothing matches.
Error response
{
"error": "outside coverage",
"regions": [
{
"slug": "nyc",
"name": "New York City"
}
]
}
GET
/search
Search places
GET
/search/categories
List place categories
GET
/geocode
Geocode an address
GET
/reverse
Reverse geocode a point
GET
/places/nearest
Find the nearest places
GET
/places/nearby-facets
Check what’s nearby
GET
/places/{gersId}
Get a place
GET
/places/{gersId}/nearby
List places near a place
GET
/route
Get directions
POST
/route
Rank routes by your own metric
GET
/isochrone
Get an isochrone
GET
/travel-times
Compare travel times
GET
/transit/plan
Plan a transit trip
GET
/transit/stops/nearest
Find the nearest transit stops
GET
/transit/lines
List transit lines
GET
/divisions/containing
Find the divisions containing a point
GET
/divisions/{id}/geojson
Get a division’s boundary
GET
/elevation
Get elevation
GET
/weather/at
Get current weather
GET
/hazards
List road hazards
GET
/tiles/vector/{z}/{x}/{yExt}
Get a vector tile
GET
/tiles/raster/{z}/{x}/{yExt}
Get a basemap raster tile
GET
/tiles/terrain/{z}/{x}/{yExt}
Get a terrain tile
GET
/raster/{dataset}/{z}/{x}/{yExt}
Get a satellite imagery tile
GET
/ee/datasets
List analysis datasets
POST
/ee/check
Check a script
POST
/ee/run
Run a script
GET
/ee/reports
List reports
GET
/ee/reports/{id}
Get a report
DELETE
/ee/reports/{id}
Delete a report
GET
/ee/reports/{id}/view
View a report
GET
/ee/reports/{id}/kepler.json
Export a report to kepler.gl
GET
/ee/reports/{id}/layers/{i}/{z}/{x}/{yExt}
Get a report layer tile
GET
/ee/assets
List table assets
PUT
/ee/assets
Upload a table asset
GET
/export/3d-tiles/tileset.json
Export 3D Tiles (tileset)
GET
/export/3d-tiles/content.glb
Export 3D Tiles (content)
GET
/export/opendrive.xodr
Export OpenDRIVE
GET
/export/openscenario.xosc
Export OpenSCENARIO
GET
/healthz
Health check
Places and search #
Overture places and addresses: full-text search, geocoding, nearest-by-category and place detail.
Search places #
GET
/search
Atlas user token
Full-text search over places, optionally biased toward a point and filtered to one category.
Query parameters
q
string
required
Search text.
near
string
Bias results toward lat,lng.
category
string
Overture category, e.g. coffee_shop (see GET /search/categories).
limit
number
Maximum results.
Request
curl
curl "https://atlas-api-dusky.vercel.app/search?q=coffee" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"results": [
{
"gersId": "08f2a100d2c4b2a5",
"name": "Bryant Park Café",
"category": "coffee_shop",
"lngLat": [
-73.98371,
40.75363
],
"distanceM": null,
"addressFreeform": "40 W 40th St",
"score": 0.82
}
]
}
Errors
400
q is missing.
List place categories #
GET
/search/categories
Atlas user token
Every place category with how many places carry it. Cached for five minutes.
Request
curl
curl "https://atlas-api-dusky.vercel.app/search/categories" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"categories": [
{
"category": "restaurant",
"count": 18234
},
{
"category": "coffee_shop",
"count": 2210
}
]
}
Geocode an address #
GET
/geocode
Atlas user token
Turn an address into ranked candidate points.
Query parameters
q
string
required
Address text.
limit
number
Maximum results.
Request
curl
curl "https://atlas-api-dusky.vercel.app/geocode?q=20%20W%2034th%20St" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"results": [
{
"kind": "address",
"label": "20 W 34th St",
"lngLat": [
-73.98566,
40.74843
],
"gersId": "08f2a100d2c4c0de",
"score": 0.91
}
]
}
Errors
400
q is missing.
Reverse geocode a point #
GET
/reverse
Atlas user token
The nearest address or place to a point; falls back to the nearest street (kind: 'segment'), or kind: 'none'.
Query parameters
at
string
required
Point as lat,lng.
Request
curl
curl "https://atlas-api-dusky.vercel.app/reverse?at=40.7484%2C-73.9857" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"kind": "address",
"label": "20 W 34th St",
"lngLat": [
-73.98566,
40.74843
],
"gersId": "08f2a100d2c4c0de",
"distanceM": 12.4
}
Errors
400
at is missing or isn’t lat,lng.
Find the nearest places #
GET
/places/nearest
Atlas user token
The closest places in one or more categories, nearest first, with distances.
Query parameters
at
string
required
Point as lat,lng.
categories
string
required
Comma-separated categories, e.g. pharmacy,grocery_store.
limit
number
Maximum results.
maxM
number
Search radius in meters.
Request
curl
curl "https://atlas-api-dusky.vercel.app/places/nearest?at=40.7484%2C-73.9857&categories=pharmacy" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"results": [
{
"gersId": "08f2a100d2c49f10",
"name": "Duane Reade",
"category": "pharmacy",
"distanceM": 86.2,
"lngLat": [
-73.98654,
40.74888
]
}
]
}
Errors
400
at is missing or isn’t lat,lng.
400
categories is missing.
Check what’s nearby #
GET
/places/nearby-facets
Atlas user token
For each requested facet (grocery, park, pharmacy, coffee, gym, restaurant, school), the single nearest match or null. Built for walkability-style listing facets.
Query parameters
at
string
required
Point as lat,lng.
facets
string
required
Comma-separated facet names.
maxM
number
Search radius in meters.
Request
curl
curl "https://atlas-api-dusky.vercel.app/places/nearby-facets?at=40.7484%2C-73.9857&facets=grocery%2Cpark" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"facets": {
"grocery": {
"gersId": "08f2a100d2c4a001",
"name": "Whole Foods Market",
"distanceM": 412.7,
"lngLat": [
-73.98894,
40.75143
]
},
"park": null
}
}
Errors
400
at is missing or isn’t lat,lng.
400
facets is missing or names an unknown facet.
Get a place #
GET
/places/{gersId}
Atlas user token
Full detail for one place by its Overture GERS id: category, confidence, contact details and location.
Path parameters
gersId
string
required
Overture GERS id.
Request
curl
curl "https://atlas-api-dusky.vercel.app/places/08f2a100d2c4b2a5" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"gersId": "08f2a100d2c4b2a5",
"name": "Bryant Park Café",
"category": "coffee_shop",
"alternateCategories": [
"cafe"
],
"confidence": 0.94,
"websites": [
"https://example.com"
],
"addressFreeform": "40 W 40th St",
"addressLocality": "New York"
}
Errors
404
The place doesn’t exist (or isn’t yours and isn’t public).
List places near a place #
GET
/places/{gersId}/nearby
Atlas user token
Other places within 250 m of the given one, nearest first. An unknown id returns an empty list.
Path parameters
gersId
string
required
Overture GERS id.
Query parameters
limit
number
Maximum results.
Default 10
Request
curl
curl "https://atlas-api-dusky.vercel.app/places/08f2a100d2c4b2a5/nearby" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"nearby": [
{
"gersId": "08f2a100d2c4b2b1",
"name": "Kinokuniya",
"category": "bookstore",
"lngLat": [
-73.98326,
40.75406
],
"distanceM": 54.3,
"addressFreeform": "1073 6th Ave"
}
]
}
Routing and travel time #
Drive, walk and bike routing on Atlas’s own road graph, isochrones, and GTFS transit trip planning.
Get directions #
GET
/route
Atlas user token
Turn-by-turn directions between two points on Atlas’s road graph. Endpoints snap to the nearest road usable by the mode; the X-Atlas-Graph-Generation header identifies the graph version that answered.
Query parameters
from
string
required
Origin as lat,lng.
to
string
required
Destination as lat,lng.
mode
'drive' | 'walk' | 'bike'
Travel mode.
Default 'drive'
Request
curl
curl "https://atlas-api-dusky.vercel.app/route?from=40.7484%2C-73.9857&to=40.7580%2C-73.9855" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"mode": "walk",
"durationS": 812,
"distanceM": 1043,
"geometry": {
"type": "LineString",
"coordinates": [
[
-73.98566,
40.74843
],
[
-73.98551,
40.75797
]
]
},
"steps": [
{
"instruction": "Head north on 5th Avenue",
"name": "5th Avenue",
"distanceM": 1043,
"durationS": 812,
"startCoordIdx": 0
}
],
"snappedFrom": [
-73.98566,
40.74843
],
"snappedTo": [
-73.98551,
40.75797
]
}
Errors
400
from or to is missing or isn’t lat,lng.
400
mode isn’t drive, walk or bike.
400
The point is outside every active region; the body lists the regions that are covered.
404
No road within 500 m of the point for this mode.
404
No route connects the two points.
Rank routes by your own metric #
POST
/route
Atlas user token
Directions that minimize travel time × (1 + Σ weight × value), where each value comes from a grid you send: heat stress, noise, air quality, anything you can map. Each street takes the mean of the cells along it, and an empty cell borrows from its neighbors so a street drawn slightly differently on another map still matches. Values ≤ 0 and empty cells add nothing, so the ranked route is never cheaper than travel time. durationS is real travel time; costS is the cost it was ranked by. Set compare to get the plain fastest route alongside.
Request body
from
string
required
Origin as lat,lng or { lat, lng }.
to
string
required
Destination as lat,lng or { lat, lng }.
mode
string
drive, walk or bike.
Default drive
weights
object[]
Up to 4 layers { weight, grid }. grid is { bbox: [west, south, east, north], width, height } plus either values (row-major, north row first, null = no data) or data (base64 bytes, value = offset + byte × scale, 255 = no data). Up to 1,000,000 cells per grid.
compare
boolean
Also return the plain fastest route as fastest.
Default false
Request
curl
curl -X POST "https://atlas-api-dusky.vercel.app/route" \
-H "Authorization: Bearer $ATLAS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"from":"40.7484,-73.9857","to":"40.7580,-73.9855","mode":"walk","compare":true,"weights":[{"weight":1,"grid":{"bbox":[-73.99,40.745,-73.98,40.76],"width":2,"height":2,"values":[0,0.4,null,1.2]}}]}'
Response · 200
application/json
{
"mode": "walk",
"durationS": 861,
"costS": 903,
"distanceM": 1102,
"geometry": {
"type": "LineString",
"coordinates": [
[
-73.98566,
40.74843
],
[
-73.98551,
40.75797
]
]
},
"steps": [
{
"instruction": "Head north on Madison Avenue",
"name": "Madison Avenue",
"distanceM": 1102,
"durationS": 861,
"startCoordIdx": 0
}
],
"snappedFrom": [
-73.98566,
40.74843
],
"snappedTo": [
-73.98551,
40.75797
],
"fastest": {
"mode": "walk",
"durationS": 812,
"distanceM": 1043
}
}
Errors
400
The body isn’t JSON, a point or mode is invalid, or a weight layer is malformed (the message names the field).
400
The point is outside every active region; the body lists the regions that are covered.
404
No road within 500 m of the point for this mode.
404
No route connects the two points.
Get an isochrone #
GET
/isochrone
Atlas user token
The area reachable from a point within a time budget, as a polygon. Powers “within 20 minutes of work” searches.
Query parameters
lat
number
required
Latitude (WGS84).
lng
number
required
Longitude (WGS84).
mode
'drive' | 'walk' | 'bike'
Travel mode.
Default 'drive'
maxDurationS
number
required
Time budget in seconds.
Request
curl
curl "https://atlas-api-dusky.vercel.app/isochrone?lat=40.7484&lng=-73.9857&maxDurationS=900" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"mode": "walk",
"maxDurationS": 900,
"polygon": {
"type": "Polygon",
"coordinates": [
[
[
-73.98566,
40.74843
]
]
]
},
"origin": [
-73.98566,
40.74843
]
}
Errors
400
lat and lng are missing or not numbers.
400
mode or maxDurationS is invalid.
400
The point is outside every active region; the body lists the regions that are covered.
404
No road within 500 m of the point for this mode.
Compare travel times #
GET
/travel-times
Atlas user token
Drive, walk, bike and transit times between two points in one call. Each mode reports ok: false with a note instead of failing the whole request.
Query parameters
from
string
required
Origin as lat,lng.
to
string
required
Destination as lat,lng.
depart
string
Local departure time, YYYY-MM-DDTHH:mm[:ss]. Defaults to now in the region’s time zone.
Request
curl
curl "https://atlas-api-dusky.vercel.app/travel-times?from=40.7484%2C-73.9857&to=40.7580%2C-73.9855" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"modes": [
{
"mode": "drive",
"ok": true,
"durationS": 402,
"distanceM": 1890
},
{
"mode": "walk",
"ok": true,
"durationS": 812,
"distanceM": 1043
},
{
"mode": "bike",
"ok": true,
"durationS": 301,
"distanceM": 1120
},
{
"mode": "transit",
"ok": false,
"note": "no service"
}
]
}
Errors
400
from or to is missing or isn’t lat,lng.
Plan a transit trip #
GET
/transit/plan
Atlas user token
Walk + transit itineraries from GTFS timetables, with local and ISO times for every leg.
Query parameters
from
string
required
Origin as lat,lng.
to
string
required
Destination as lat,lng.
depart
string
Local departure time, YYYY-MM-DDTHH:mm[:ss]. Defaults to now in the region’s time zone.
Request
curl
curl "https://atlas-api-dusky.vercel.app/transit/plan?from=40.7484%2C-73.9857&to=40.7580%2C-73.9855" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"itineraries": [
{
"departureS": 30600,
"arrivalS": 31920,
"durationS": 1320,
"departureISO": "2026-10-26T12:30:00.000Z",
"arrivalISO": "2026-10-26T12:52:00.000Z",
"legs": [
{
"kind": "walk",
"durationS": 240
},
{
"kind": "transit",
"routeShortName": "Q",
"boardS": 30840,
"alightS": 31680,
"boardISO": "2026-10-26T12:34:00.000Z",
"alightISO": "2026-10-26T12:48:00.000Z"
}
]
}
]
}
Errors
400
from or to is missing or isn’t lat,lng.
400
The point is outside every active region; the body lists the regions that are covered.
Find the nearest transit stops #
GET
/transit/stops/nearest
Atlas user token
Closest GTFS stops to a point, nearest first.
Query parameters
at
string
required
Point as lat,lng.
limit
number
Maximum results.
maxM
number
Search radius in meters.
Request
curl
curl "https://atlas-api-dusky.vercel.app/transit/stops/nearest?at=40.7484%2C-73.9857" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"results": [
{
"stopId": "D17",
"name": "34 St-Herald Sq",
"distanceM": 210.5,
"lngLat": [
-73.98782,
40.74961
],
"routes": [
"B",
"D",
"F",
"M",
"N",
"Q",
"R",
"W"
]
}
]
}
Errors
400
at is missing or isn’t lat,lng.
List transit lines #
GET
/transit/lines
Atlas user token
Line geometry and colors for drawing a transit map, optionally for one feed and one bounding box. Cached for an hour.
Query parameters
feed
string
GTFS feed slug.
bbox
string
minLng,minLat,maxLng,maxLat.
Request
curl
curl "https://atlas-api-dusky.vercel.app/transit/lines" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"lines": [
{
"routeId": "Q",
"shortName": "Q",
"color": "#FCCC0A",
"geometry": {
"type": "LineString",
"coordinates": []
}
}
]
}
Errors
400
Unknown feed, or a malformed bbox.
Boundaries, terrain and conditions #
Administrative divisions, elevation, live weather and road hazards for a point.
Find the divisions containing a point #
GET
/divisions/containing
Atlas user token
Every administrative division that contains a point (neighborhood, city, county, region, country), most specific first.
Query parameters
lat
number
required
Latitude (WGS84).
lng
number
required
Longitude (WGS84).
Request
curl
curl "https://atlas-api-dusky.vercel.app/divisions/containing?lat=40.7484&lng=-73.9857" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"divisions": [
{
"gersId": "085718b5ffffffff",
"kind": "neighborhood",
"name": "Midtown",
"country": "US",
"region": "US-NY"
},
{
"gersId": "0857186bffffffff",
"kind": "locality",
"name": "New York",
"country": "US",
"region": "US-NY"
}
]
}
Errors
400
lat and lng are missing or not numbers.
Get a division’s boundary #
GET
/divisions/{id}/geojson
Atlas user token
One division’s boundary as a GeoJSON geometry.
Path parameters
id
string
required
Division GERS id, from GET /divisions/containing.
Request
curl
curl "https://atlas-api-dusky.vercel.app/divisions/085718b5ffffffff/geojson" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"gersId": "085718b5ffffffff",
"kind": "neighborhood",
"name": "Midtown",
"geometry": {
"type": "MultiPolygon",
"coordinates": []
}
}
Errors
404
The division doesn’t exist (or isn’t yours and isn’t public).
Get elevation #
GET
/elevation
Atlas user token
Ground elevation at a point from the region’s elevation grid, interpolated between samples.
Query parameters
lat
number
required
Latitude (WGS84).
lng
number
required
Longitude (WGS84).
Request
curl
curl "https://atlas-api-dusky.vercel.app/elevation?lat=40.7484&lng=-73.9857" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"elevationM": 17.8,
"interpolated": true
}
Errors
400
lat and lng are missing or not numbers.
400
The point is outside every active region; the body lists the regions that are covered.
404
The region has no elevation data yet.
Get current weather #
GET
/weather/at
Atlas user token
The latest observation from the nearest station: temperature, wind, visibility, ceiling and sky cover. Each call is also recorded as an observation.
Query parameters
lat
number
required
Latitude (WGS84).
lng
number
required
Longitude (WGS84).
Request
curl
curl "https://atlas-api-dusky.vercel.app/weather/at?lat=40.7484&lng=-73.9857" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"observedAt": "2026-10-26T02:51:00.000Z",
"stationId": "KNYC",
"temperatureC": 11.7,
"windSpeedMs": 3.1,
"windDirectionDeg": 310,
"visibilityM": 16090,
"ceilingM": null,
"skyCover": "CLR"
}
Errors
400
lat and lng are missing or not numbers.
400
The point is outside every active region; the body lists the regions that are covered.
502
The weather source had no observation.
List road hazards #
GET
/hazards
Atlas user token
Active road work and incidents in the point’s region, as a GeoJSON FeatureCollection in the WZDx feed shape.
Query parameters
lat
number
required
Latitude (WGS84).
lng
number
required
Longitude (WGS84).
Request
curl
curl "https://atlas-api-dusky.vercel.app/hazards?lat=40.7484&lng=-73.9857" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"type": "FeatureCollection",
"features": [
{
"id": "wz-1042",
"type": "Feature",
"properties": {
"core_details": {
"event_type": "work-zone",
"road_names": [
"W 34th St"
],
"direction": "eastbound"
},
"vehicle_impact": "some-lanes-closed"
},
"geometry": {
"type": "LineString",
"coordinates": []
}
}
]
}
Errors
400
lat and lng are missing or not numbers.
400
The point is outside every active region; the body lists the regions that are covered.
Map tiles #
Vector, raster, terrain and satellite-imagery tiles in the standard {z}/{x}/{y} scheme.
Get a vector tile #
GET
/tiles/vector/{z}/{x}/{yExt}
Atlas user token
A Mapbox Vector Tile of roads, buildings, land use, water and places, for MapLibre or any MVT client.
Path parameters
z
number
required
Zoom level (Web Mercator).
x
number
required
Tile column.
yExt
string
required
Tile row with its extension, e.g. 6158.mvt.
Request
curl
curl "https://atlas-api-dusky.vercel.app/tiles/vector/14/4824/6158.mvt" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/vnd.mapbox-vector-tile
<binary application/vnd.mapbox-vector-tile>
Errors
400
The path doesn’t end in .mvt, or the tile index is out of range.
Get a basemap raster tile #
GET
/tiles/raster/{z}/{x}/{yExt}
Atlas user token
A rendered PNG basemap tile, in the default or vibrant theme.
Path parameters
z
number
required
Zoom level (Web Mercator).
x
number
required
Tile column.
yExt
string
required
Tile row with its extension, e.g. 6158.png.
Query parameters
scale
'1' | '2'
2 renders a high-DPI (Retina) tile.
Default '1'
theme
'vibrant'
Alternate, higher-contrast palette.
Request
curl
curl "https://atlas-api-dusky.vercel.app/tiles/raster/14/4824/6158.png" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
image/png
<binary image/png>
Errors
400
The path doesn’t end in .png, or the tile index is out of range.
Get a terrain tile #
GET
/tiles/terrain/{z}/{x}/{yExt}
Atlas user token
Shaded relief rendered from the region’s elevation grid.
Path parameters
z
number
required
Zoom level (Web Mercator).
x
number
required
Tile column.
yExt
string
required
Tile row with its extension, e.g. 6158.png.
Query parameters
scale
'1' | '2'
2 renders a high-DPI (Retina) tile.
Default '1'
Request
curl
curl "https://atlas-api-dusky.vercel.app/tiles/terrain/14/4824/6158.png" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
image/png
<binary image/png>
Get a satellite imagery tile #
GET
/raster/{dataset}/{z}/{x}/{yExt}
Atlas user token
A tile from an ingested remote-sensing dataset (for example land surface temperature or nighttime lights), rendered on demand from cloud-optimized GeoTIFFs. Colormap, rescale range and band algorithm are request parameters, like Earth Engine visParams.
Path parameters
dataset
string
required
Dataset id from the Atlas imagery catalog.
z
number
required
Zoom level (Web Mercator).
x
number
required
Tile column.
yExt
string
required
Tile row with its extension, e.g. 6158.png.
Query parameters
date
string
Scene date (YYYY-MM-DD). Defaults to the latest.
rescale
string
Value range mapped to the colormap, e.g. 270,320.
colormap_name
string
Named colormap, e.g. inferno.
algorithm
string
Per-pixel band algorithm, e.g. normalizedIndex.
Request
curl
curl "https://atlas-api-dusky.vercel.app/raster/modis-lst-day/9/436/197.png" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
image/png
<binary image/png>
Errors
404
Unknown dataset, or no scene covers the tile.
502
The tile engine is unreachable.
Earth Engine-compatible analysis #
Check and run unmodified Earth Engine Code Editor scripts, then serve the resulting reports, charts and map layers. See Earth Engine compatibility.
List analysis datasets #
GET
/ee/datasets
Atlas user token
The Earth Engine collection ids Atlas can serve (Landsat, Sentinel-2, MODIS, SRTM, …) and whether each is available now or needs-ingest.
Request
curl
curl "https://atlas-api-dusky.vercel.app/ee/datasets" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"datasets": [
{
"id": "LANDSAT/LC09/C02/T1_L2",
"type": "ImageCollection",
"title": "Landsat 9 Collection 2 Level-2",
"bands": [
"SR_B4",
"SR_B5",
"ST_B10"
],
"scale": 30,
"provider": "USGS",
"status": "available"
}
]
}
Check a script #
POST
/ee/check
Atlas user token
Static analysis of a Code Editor script: which ee.* calls and datasets it uses and whether Atlas supports all of them, without running it.
Request body
script
string
required
The script source, unmodified.
Request
curl
curl -X POST "https://atlas-api-dusky.vercel.app/ee/check" \
-H "Authorization: Bearer $ATLAS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"script":"var lst = ee.ImageCollection('MODIS/061/MOD11A2').select('LST_Day_1km').mean();\nprint(lst.reduceRegion(ee.Reducer.mean(), roi, 1000));"}'
Response · 200
application/json
{
"statics": {
"used": [
"ee.ImageCollection",
"ee.Reducer.mean"
],
"unsupported": []
},
"methods": {
"used": [
"select",
"mean",
"reduceRegion"
],
"unsupported": []
},
"datasets": [
{
"id": "MODIS/061/MOD11A2",
"available": true
}
],
"stubbed": [],
"ok": true
}
Errors
400
script is missing.
413
The script is too large.
Run a script #
POST
/ee/run
Atlas user token required
Runs a Code Editor script and saves the result as a report: printed values, chart data and map layers rendered on demand. Needs a long-running server (ATLAS_EE_RUN=1).
Request body
script
string
required
The script source, unmodified.
title
string
Report title.
public
boolean
Let anyone with the link view the report.
Default false
Request
curl
curl -X POST "https://atlas-api-dusky.vercel.app/ee/run" \
-H "Authorization: Bearer $ATLAS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"script":"var img = ee.Image('USGS/SRTMGL1_003');\nMap.addLayer(img, {min: 0, max: 500}, 'Elevation');","title":"Seoul elevation"}'
Response · 201
application/json
{
"id": "rpt_7f3c",
"status": "ok",
"title": "Seoul elevation",
"layers": 1,
"charts": 0,
"warnings": [],
"error": null
}
Errors
401
Sign in first (user token).
400
script is missing.
413
The script is too large.
501
Script execution isn’t enabled on this deployment.
List reports #
GET
/ee/reports
Atlas user token
Your reports and public ones, newest first.
Query parameters
limit
number
Maximum results.
Default 50
Request
curl
curl "https://atlas-api-dusky.vercel.app/ee/reports" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"reports": [
{
"id": "rpt_7f3c",
"title": "Seoul elevation",
"status": "ok",
"createdAt": "2026-10-26T02:10:00.000Z"
}
]
}
Get a report #
GET
/ee/reports/{id}
Atlas user token
A report’s script, printed output, chart data tables and layer definitions.
Path parameters
id
string
required
Report id, from POST /ee/run or GET /ee/reports.
Request
curl
curl "https://atlas-api-dusky.vercel.app/ee/reports/rpt_7f3c" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"id": "rpt_7f3c",
"ownerId": "usr_19",
"isPublic": false,
"createdAt": "2026-10-26T02:10:00.000Z",
"report": {
"prints": [],
"charts": [],
"layers": [
{
"name": "Elevation"
}
]
}
}
Errors
404
The report doesn’t exist (or isn’t yours and isn’t public).
Delete a report #
DELETE
/ee/reports/{id}
Atlas user token required
Deletes one of your reports.
Path parameters
id
string
required
Report id, from POST /ee/run or GET /ee/reports.
Request
curl
curl -X DELETE "https://atlas-api-dusky.vercel.app/ee/reports/rpt_7f3c" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"ok": true
}
Errors
401
Sign in first (user token).
404
The report doesn’t exist (or isn’t yours and isn’t public).
View a report #
GET
/ee/reports/{id}/view
Atlas user token
A shareable HTML page with the report’s map, charts and printed output.
Path parameters
id
string
required
Report id, from POST /ee/run or GET /ee/reports.
Request
curl
curl "https://atlas-api-dusky.vercel.app/ee/reports/rpt_7f3c/view" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
text/html
<!doctype html>…
Errors
404
The report doesn’t exist (or isn’t yours and isn’t public).
Export a report to kepler.gl #
GET
/ee/reports/{id}/kepler.json
Atlas user token
A kepler.gl map config for the report, so it opens in kepler.gl or Dekart.
Path parameters
id
string
required
Report id, from POST /ee/run or GET /ee/reports.
Request
curl
curl "https://atlas-api-dusky.vercel.app/ee/reports/rpt_7f3c/kepler.json" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"version": "v1",
"config": {
"visState": {
"layers": []
}
}
}
Errors
404
The report doesn’t exist (or isn’t yours and isn’t public).
Get a report layer tile #
GET
/ee/reports/{id}/layers/{i}/{z}/{x}/{yExt}
Atlas user token
One map layer of a report, rendered as a PNG tile on demand from the layer’s stored graph.
Path parameters
id
string
required
Report id, from POST /ee/run or GET /ee/reports.
i
number
required
Layer index in the report.
z
number
required
Zoom level (Web Mercator).
x
number
required
Tile column.
yExt
string
required
Tile row with its extension, e.g. 6158.png.
Request
curl
curl "https://atlas-api-dusky.vercel.app/ee/reports/rpt_7f3c/layers/0/14/4824/6158.png" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
image/png
<binary image/png>
Errors
404
The report doesn’t exist (or isn’t yours and isn’t public).
400
Not a .png path, or the tile or layer is out of range.
502
Evaluating the layer failed.
List table assets #
GET
/ee/assets
Atlas user token
Uploaded tables scripts can load with ee.FeatureCollection(id).
Request
curl
curl "https://atlas-api-dusky.vercel.app/ee/assets" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"assets": [
{
"id": "projects/jane/assets/seoul-stations",
"featureCount": 25
}
]
}
Upload a table asset #
PUT
/ee/assets
Atlas user token required
Creates or replaces a GeoJSON FeatureCollection under projects/<you>/assets/<name>, the same way an Earth Engine table asset is addressed.
Request body
id
string
required
projects/<you>/assets/<name>.
geojson
FeatureCollection
required
The features.
Request
curl
curl -X PUT "https://atlas-api-dusky.vercel.app/ee/assets" \
-H "Authorization: Bearer $ATLAS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id":"projects/jane/assets/seoul-stations","geojson":{"type":"FeatureCollection","features":[]}}'
Response · 201
application/json
{
"id": "projects/jane/assets/seoul-stations",
"featureCount": 25
}
Errors
401
Sign in first (user token).
400
Bad id, or geojson isn’t a FeatureCollection.
403
That asset id belongs to another user.
413
Too many features.
Digital-twin export #
A region as simulator-ready scene files: 3D Tiles, OpenDRIVE and OpenSCENARIO.
Export 3D Tiles (tileset) #
GET
/export/3d-tiles/tileset.json
Atlas user token
The OGC 3D Tiles tileset for the region containing the point; its content is content.glb.
Query parameters
lat
number
required
Latitude (WGS84).
lng
number
required
Longitude (WGS84).
Request
curl
curl "https://atlas-api-dusky.vercel.app/export/3d-tiles/tileset.json?lat=40.7484&lng=-73.9857" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/json
{
"asset": {
"version": "1.1"
},
"geometricError": 500,
"root": {
"content": {
"uri": "content.glb"
}
}
}
Errors
400
lat and lng are missing or not numbers.
400
The point is outside every active region; the body lists the regions that are covered.
Export 3D Tiles (content) #
GET
/export/3d-tiles/content.glb
Atlas user token
The region’s extruded buildings and roads as binary glTF.
Query parameters
lat
number
required
Latitude (WGS84).
lng
number
required
Longitude (WGS84).
Request
curl
curl "https://atlas-api-dusky.vercel.app/export/3d-tiles/content.glb?lat=40.7484&lng=-73.9857" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
model/gltf-binary
<binary model/gltf-binary>
Errors
400
lat and lng are missing or not numbers.
400
The point is outside every active region; the body lists the regions that are covered.
Export OpenDRIVE #
GET
/export/opendrive.xodr
Atlas user token
The region’s road network as ASAM OpenDRIVE, ready for CARLA and other driving simulators.
Query parameters
lat
number
required
Latitude (WGS84).
lng
number
required
Longitude (WGS84).
Request
curl
curl "https://atlas-api-dusky.vercel.app/export/opendrive.xodr?lat=40.7484&lng=-73.9857" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/xml
<?xml version="1.0"?>
<OpenDRIVE>…</OpenDRIVE>
Errors
400
lat and lng are missing or not numbers.
400
The point is outside every active region; the body lists the regions that are covered.
Export OpenSCENARIO #
GET
/export/openscenario.xosc
Atlas user token
An ASAM OpenSCENARIO file that references the region’s opendrive.xodr.
Query parameters
lat
number
required
Latitude (WGS84).
lng
number
required
Longitude (WGS84).
Request
curl
curl "https://atlas-api-dusky.vercel.app/export/openscenario.xosc?lat=40.7484&lng=-73.9857" \
-H "Authorization: Bearer $ATLAS_TOKEN"
Response · 200
application/xml
<?xml version="1.0"?>
<OpenSCENARIO>…</OpenSCENARIO>
Errors
400
lat and lng are missing or not numbers.
400
The point is outside every active region; the body lists the regions that are covered.