Gaussian Splat Upload
Upload a Gaussian Splat (.ply + poses.json) as a Multiset VPS map via the REST API.
Gaussian Splats are uploaded through the same two-step multipart flow as e57 maps (POST /v2/vps/map → upload parts → /complete-upload/{id}). The only thing that changes is the source object you send in Step 1 — it describes that the file is a Gaussian Splat and carries splat-specific metadata.
What to upload
A single .zip containing both:
point_cloud.ply, the Gaussian Splat file.poses.json, the training camera poses.Tis the camera position,Rthe camera to world rotation as a[w, x, y, z]quaternion with+Zforward.
Both files must be at the root of the archive. See Gaussian Splat for export details and the poses.json schema.
source object for Gaussian Splat
"source": {
"provider": "xgrid",
"fileType": "splat",
"coordinateSystem": "RHS-Z-UP",
"metadata": {
"mode": "indoor",
"hasPoses": true
}
}provider
"xgrid" | "others"
xgrid for a Lixel CyberColor export. Use others for a splat trained in any other tool.
fileType
"splat"
Tells the server this is a Gaussian Splat upload (not e57 / zip).
coordinateSystem
"RHS-Z-UP" | "RHS-Y-UP"
The frame your splat and poses.json are in. Xgrids exports are right-handed Z up. Most other trainers, COLMAP included, are right-handed Y up, so send RHS-Y-UP and the pipeline rotates for you.
metadata.mode
"indoor" | "outdoor"
Pick the one that matches the capture, it affects VPS accuracy.
metadata.hasPoses
true
Must be true. poses.json is required for VPS.
Example — create a Gaussian Splat map (Step 1)
The response contains mapId, uploadId, and the array of presigned signedUrls — exactly like the e57 flow.
Next steps
After Step 1:
Split your
.zipinto chunks andPUTeach chunk to the corresponding presigned URL. Capture theETagof every part.Call
POST /v2/vps/map/complete-upload/{mapId}with theuploadId, S3 key, and the array of{ PartNumber, ETag }.
Both endpoints are identical to the e57 upload — see the Map Upload overview for the full OpenAPI specs.
Last updated
Was this helpful?

