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
If PowerShell says prism is not recognized, your Python
Scripts folder isn't on PATH (pip prints a warning about this during install). Either run the
module form — py -m prism_lidarcloud.cli run "C:\surveys\scan.las" --out products.zip —
or add the Scripts folder pip named to your PATH and reopen the terminal.
macOS / Linux
python3 -m pip install --upgrade prism-lidarcloud
export PRISM_API_KEY="prism_live_xxxxxxxxxxxx"
prism run ./scan.las --out products.zip
If prism is not found, use the module form:
python3 -m prism_lidarcloud.cli run ./scan.las --out products.zip (or add
~/.local/bin to your PATH).
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 finished product files so clients can download the
complete deliverable package in parallel — 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. When the PRISM-3DEP products haven’t been built for the dataset yet, returns
409 with a machine-readable {prereq} block whose run_url builds
them on demand — the app does this automatically and retries, so a missing prerequisite never
requires re-processing the upload.
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