> For the complete documentation index, see [llms.txt](https://docs.multiset.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.multiset.ai/fundamentals/rest-api-docs/map-upload/gaussian-splat-upload.md).

# 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`](/fundamentals/rest-api-docs/map-upload.md) → 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. `T` is the camera position, `R` the camera to world rotation as a `[w, x, y, z]` quaternion with `+Z` forward.

Both files must be at the root of the archive. See [Gaussian Splat](/fundamentals/third-party-scans/gaussian-splat.md) for export details and the `poses.json` schema.

## `source` object for Gaussian Splat

```json
"source": {
  "provider": "xgrid",
  "fileType": "splat",
  "coordinateSystem": "RHS-Z-UP",
  "metadata": {
    "mode": "indoor",
    "hasPoses": true
  }
}
```

| Field               | Value                        | Notes                                                                                                                                                                                                 |
| ------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `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.                                                                                                                                                     |

{% hint style="warning" %}
**A splat upload must declare `RHS-Z-UP` or `RHS-Y-UP`.** Any other value is rejected when the map is created. Declare the frame your file is actually in: a splat processed in the wrong frame produces a map whose mesh, floor map and poses are all upside down.
{% endhint %}

{% hint style="info" %}
**Right-handed Y up inputs no longer need converting.** Set `coordinateSystem` to `RHS-Y-UP` and the pipeline rotates the splat, its spherical harmonics, and `poses.json` into the working frame together. See [Splats from Other Tools](/fundamentals/third-party-scans/gaussian-splat/splats-from-other-tools.md).
{% endhint %}

## Example — create a Gaussian Splat map (Step 1)

```bash
curl --location 'https://api.multiset.ai/v2/vps/map' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--data '{
    "mapName": "Abode Splat No Pose",
    "coordinates": {
        "latitude": 37.7770709310221,
        "longitude": -122.43656613753897,
        "altitude": 70.0325927734375
    },
    "source": {
        "provider": "xgrid",
        "fileType": "splat",
        "coordinateSystem": "RHS-Z-UP",
        "metadata": {
            "mode": "indoor",
            "hasPoses": true
        }
    }
}'
```

The response contains `mapId`, `uploadId`, and the array of presigned `signedUrls` — exactly like the e57 flow.

## Next steps

After Step 1:

1. Split your `.zip` into chunks and `PUT` each chunk to the corresponding presigned URL. Capture the `ETag` of every part.
2. Call `POST /v2/vps/map/complete-upload/{mapId}` with the `uploadId`, S3 key, and the array of `{ PartNumber, ETag }`.

Both endpoints are identical to the e57 upload — see the [Map Upload overview](/fundamentals/rest-api-docs/map-upload.md) for the full OpenAPI specs.

{% hint style="warning" %}
**`hasPoses` must be `true`.** Gaussian Splats without training poses cannot be registered for VPS. Also confirm your splat is **metric-scaled** (for Xgrids this means reconstructing with **Portability On** in Lixel CyberColor).
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.multiset.ai/fundamentals/rest-api-docs/map-upload/gaussian-splat-upload.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
