---
title: "Create a resumable splat upload"
method: POST
path: "/v1/splats/uploads"
tags: ["Uploads"]
---

# Create a resumable splat upload

`POST /v1/splats/uploads`

## Request

- Base URL: `https://playcanvas.com/api/supersplat`
- URL: `https://playcanvas.com/api/supersplat/v1/splats/uploads`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/playcanvas/apis/supersplat-api/docs/v1/splats/uploads/post.ts> (a function with typed inputs; its response is checked against the schema)

Starts a multipart upload and returns a resumable upload session. `title` is optional; when omitted, PlayCanvas assigns a default title. New splats are unlisted by default. Use `softwareTools` to explicitly attribute catalogue software IDs to the created splat.

## Headers

- `Idempotency-Key` string: Optional key for retrying create-upload requests safely. Reusing the same key returns the existing upload session.

## Request body

- CreateUploadRequest: Request body for creating a resumable splat upload session.
  - `contentLength` integer, nullable: Total source file size in bytes. Optional but strongly recommended; when provided, PlayCanvas can reject over-limit uploads before S3 multipart upload starts.
  - `sourceFormat` 'ply' | 'sog' | 'ssog' | 'lcc', required: Format of the file being uploaded. Use `ply` for raw Gaussian splat PLY files, `sog` for SOG files, `ssog` for SSOG archives exported by SuperSplat, and `lcc` for LCC archives.
  - `title` string: Optional display title for the splat. If omitted, PlayCanvas assigns a default title.
  - `description` string: Optional display description for the splat.
  - `uploadClient` UploadClient: Client application details captured with the upload.
    - `id` string, required: Stable lowercase identifier for the application or integration creating the upload, such as `lcc-studio`.
    - `version` string: Optional version of the upload client application.
  - `softwareTools` string[]: Optional software catalogue IDs to attribute to the created splat. Use the software catalogue endpoint to discover currently supported IDs; this field is not an OpenAPI enum because the catalogue may grow over time.

## Response `200`

Existing upload session for the idempotency key

- UploadSession: Resumable upload session state.
  - `id` string, required: Resumable upload session id.
  - `status` 'created' | 'uploading' | 'processing' | 'completed' | 'canceled', required: Lifecycle state of the resumable upload session. `processing` means the bytes have been committed and the splat is being finalized.
  - `contentLength` integer, nullable, required: Total source file size declared when creating the upload, or `null` when the client did not provide one.
  - `sourceFormat` 'ply' | 'sog' | 'ssog' | 'lcc', required: Format of the file being uploaded. Use `ply` for raw Gaussian splat PLY files, `sog` for SOG files, `ssog` for SSOG archives exported by SuperSplat, and `lcc` for LCC archives.
  - `title` string, required: Display title that will be used for the created splat.
  - `description` string, required: Display description that will be used for the created splat.
  - `softwareTools` string[]: Optional software catalogue IDs to attribute to the created splat. Use the software catalogue endpoint to discover currently supported IDs; this field is not an OpenAPI enum because the catalogue may grow over time.
  - `partSize` integer, required: Server-chosen target size in bytes for each uploaded part. Use this to split the file into multipart upload ranges; the final part may be smaller.
  - `uploadedParts` object[], required: Parts already observed by the server. Useful when resuming an interrupted upload.
    - `partNumber` integer, required: One-based part number in the multipart upload.
    - `etag` string, required: ETag for the uploaded part.
    - `size` integer: Actual observed size of this uploaded part in bytes, when known. This is resume metadata, not the target chunk size.
  - `expiresAt` string, date-time, required: When this upload session expires.

## Other responses

- `201`: Upload session created
- `400`: Bad request
- `401`: Authentication required
- `403`: Forbidden
- `413`: Upload limit exceeded
- `429`: Rate limited

---

[API](https://skmtc.dev/playcanvas/apis/supersplat-api.md) - [All operations](https://skmtc.dev/playcanvas/apis/supersplat-api/llms.txt) - [OpenAPI document](https://skmtc.dev/playcanvas/apis/supersplat-api/revisions/a0f996dcea93?raw)
