# Gaussian Splat Upload

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

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

The question should be specific, self-contained, and written in natural language.
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.
