REST API reference
The full REST reference.
Process LiDAR programmatically: upload a point cloud, poll until done, download the survey-grade
product zip — the same endpoints behind the terminal example above. Prefer
the browser? See the user manual.
Base URL https://app.lidarcloud.app. All endpoints are versioned
under /api/v1 and authenticate with a Bearer API key. API jobs use the same engine,
quota and billing as the web app and appear in your usage console tagged API.
1 · Authentication #
Create a key in the app: sign in → click your email → API access →
Create API key. The key (prism_live_…) is shown once — store it like
a password. Send it as a Bearer token on every request:
Authorization: Bearer prism_live_xxxxxxxxxxxxxxxx
Revoke a key any time from the same panel; revocation takes effect immediately.
2 · Quickstart #
The client is published on PyPI:
pypi.org/project/prism-lidarcloud
— zero dependencies (pure Python standard library).
CLI
Windows PowerShell
py -m pip install --upgrade prism-lidarcloud
$env:PRISM_API_KEY = "prism_live_xxxxxxxxxxxx"
prism run "C:\surveys\scan.las" --out products.zip
macOS / Linux
python3 -m pip install --upgrade prism-lidarcloud
export PRISM_API_KEY="prism_live_xxxxxxxxxxxx"
prism run ./scan.las --out products.zip
Python
from prism_lidarcloud import Client
c = Client() # reads PRISM_API_KEY
out = c.run("scan.las", out="products.zip")
print("saved", out)
curl
macOS / Linux
KEY="prism_live_xxxxxxxxxxxx"
# 1) submit
curl -sS -X POST https://app.lidarcloud.app/api/v1/jobs \
-H "Authorization: Bearer $KEY" \
-F file=@scan.las
# -> {"job_id":"<id>","status":"queued","status_url":"...","download_url":"..."}
# 2) poll
curl -sS https://app.lidarcloud.app/api/v1/jobs/<id> -H "Authorization: Bearer $KEY"
# 3) download when status == "done"
curl -sS -L https://app.lidarcloud.app/api/v1/jobs/<id>/download \
-H "Authorization: Bearer $KEY" -o products.zip
Windows PowerShell
$KEY = "prism_live_xxxxxxxxxxxx"
curl.exe -sS -X POST "https://app.lidarcloud.app/api/v1/jobs" `
-H "Authorization: Bearer $KEY" `
-F "file=@C:\surveys\scan.las"
# replace <id> with the returned job_id
curl.exe -sS "https://app.lidarcloud.app/api/v1/jobs/<id>" `
-H "Authorization: Bearer $KEY"
curl.exe -sS -L "https://app.lidarcloud.app/api/v1/jobs/<id>/download" `
-H "Authorization: Bearer $KEY" `
-o products.zip
3 · Endpoints #
POST/api/v1/jobs
Submit a point cloud for processing. multipart/form-data:
Returns 202 with {job_id, status, status_url, download_url, quota_jobs}.
A job consumes your account quota exactly like a web upload.
GET/api/v1/jobs/{job_id}
Poll a job. Returns {job_id, status, stage, pct, error, download_url} where
status ∈ queued · running · done · error.
download_url is non-null once done.
GET/api/v1/jobs/{job_id}/download
Stream the finished product zip (404 until the job is done). Optional ?clouds=0
omits the classified point clouds. The zip holds the bare-earth DEM, DSM, CHM,
DEM-uncertainty rasters (GeoTIFF), the AOI boundary, the classified cloud, and — unless
disabled — the accuracy report (Word) + CAD bundle (DXF + LandXML). When colorization runs, a
separate *_colorized.las + a colorize.json provenance sidecar are included
(the canonical cloud stays RGB-free). Paired/3DEP runs add alignment + change products.
GET/api/v1/jobs/{job_id}/download_urls
Return short-lived signed URLs for the stored worker product tree so clients can download the
complete deliverable package in parallel, direct from object storage — rasters, clouds,
report, CAD, FGDC metadata, alignment, change products, and colorization sidecars. Optional
?clouds=0 omits classified point clouds. Response shape:
{presigned, complete, files:[{name,url,size}], expires_in}. This is the default fast
download path; use /download only when you want the serial server-built zip.
GET/api/v1/jobs
List your account’s jobs: {jobs:[{job_id, name, status, source, …}], count}.
5 · Browser endpoints (session-authenticated) #
These power the web app’s interactive views. They authenticate with your
signed-in session cookie and dataset ownership — not with an API key — so
they are not part of the stable /api/v1 programmatic surface. Documented here for
completeness.
GET/api/dep3cloud?site={id}
Render the PRISM-3DEP DEM (the bare-earth raster our engine builds from the raw
USGS 3DEP point cloud) as a 2D hillshade map overlay. With ?probe=1 it does
not render — it returns {exists, cloud}, where cloud (when present)
carries the supplementary 3D point-cloud metadata
{count, origin, zspan, classes, hasrgb, url} and url points at
/api/dep3cloud_bin. The GUI uses the probe to decide whether to reveal the “Show
3DEP cloud” (3D) toggle and the “3DEP DEM (2D)” map button. 404 when
the dataset has no PRISM-3DEP product (option off / fell back to the screening-grade DEM).
GET/api/dep3cloud_bin?site={id}
Stream the decimated raw USGS 3DEP point cloud (cloud_3dep.bin) in the same packed
[xyz f32][rgb u8][class u8] format the user cloud uses, co-registered into the user
cloud’s local frame, so the 3D viewer can overlay it (amber) for an “ours vs 3DEP”
comparison. 404 when the dataset has no 3DEP cloud.
Keys carry your account’s
quota, visibility and billing. Never embed a key in client-side code or a public repo. Questions?
hello@lidarcloud.app