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

# Gaussian Splat Upload

Gaussian Splats are uploaded through the **same two-step multipart flow** as e57 maps ([POST `/v2/vps/map`](/multiset/basics/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.

Both files must be at the root of the archive. See [Gaussian Splat](/multiset/basics/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"`                 | Scanner provider. See note below for upcoming providers.          |
| `fileType`          | `"splat"`                 | Tells the server this is a Gaussian Splat upload (not e57 / zip). |
| `coordinateSystem`  | `"RHS-Z-UP"`              | Xgrids exports use right-handed, Z-up.                            |
| `metadata.mode`     | `"indoor"` \| `"outdoor"` | Pick the one that matches the capture — affects VPS accuracy.     |
| `metadata.hasPoses` | `true`                    | Must be `true`. `poses.json` is required for VPS.                 |

{% hint style="info" %}
The example on this page is specifically for **Xgrids** Gaussian Splats (exported from Lixel CyberColor). Support for additional Gaussian Splat providers — such as **LitechFeld** — is coming soon. The `provider` value will change per pipeline; the rest of the `source` shape (`fileType`, `metadata.mode`, `metadata.hasPoses`) will stay the same.
{% 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](/multiset/basics/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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://multiset.gitbook.io/multiset/basics/rest-api-docs/map-upload/gaussian-splat-upload.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
