Process LiDAR programmatically: upload a point cloud, poll until done, download the survey-grade product zip. All docs · Open the app
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.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.
pip install prism-lidarcloud export PRISM_API_KEY=prism_live_xxxxxxxxxxxx # upload, wait, download in one step prism run scan.las --align 3dep --out products.zip
from prism_lidarcloud import Client
c = Client() # reads PRISM_API_KEY
out = c.run("scan.las", out="products.zip", align="3dep", change=True)
print("saved", out)
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 -F align=3dep
# -> {"job_id":"","status":"queued","status_url":"...","download_url":"..."}
# 2) poll
curl -sS https://app.lidarcloud.app/api/v1/jobs/ -H "Authorization: Bearer $KEY"
# 3) download when status == "done"
curl -sS -L https://app.lidarcloud.app/api/v1/jobs//download \
-H "Authorization: Bearer $KEY" -o products.zip
/api/v1/jobsSubmit a point cloud for processing. multipart/form-data:
| field | default | notes |
|---|---|---|
file | — | required — .las/.laz |
align | 3dep | none · 3dep (USGS reference) · upload (send a reference file) · existing (ref_site) |
reference | — | second cloud for paired change detection (with align=upload) |
change | 1 | run change detection vs the reference |
classify | 1 | semantic point classification (8 ASPRS classes) |
dem_res | auto | auto · 25cm · 50cm · 100cm |
vdatum | ellipsoidal | ellipsoidal · navd88 (GEOID18) |
colorize | auto | visual true-colour drape for no-RGB clouds (public imagery): auto (on when the cloud has no RGB) · on · off. Visual layer only — never affects the DEM/classification; shipped as a separate *_colorized.las |
report | 1 | include the accuracy report (Word) |
cad | 1 | include the CAD bundle (DXF + LandXML) |
Returns 202 with {job_id, status, status_url, download_url, quota_jobs}.
A job consumes your account quota exactly like a web upload.
/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.
/api/v1/jobs/{job_id}/downloadStream 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.
/api/v1/jobsList your account's jobs: {jobs:[{job_id, name, status, source, …}], count}.
| code | meaning |
|---|---|
401 | missing/invalid/revoked API key |
403 | account suspended, or key-management attempted via the API |
404 | job not found / not visible to this account |
413 | file exceeds the single-machine point limit |
429 | rate limit — back off and retry |
Keys carry your account's quota, visibility and billing. Never embed a key in client-side code or a public repo. Questions? lidarcloud.app