API Reference

/

POST /v1/uploads/splat-images

POST /api/v1/uploads/splat-images

Create short-lived signed upload URLs for a Scene thumbnail, a JPEG depth map, or both. Upload these images before committing the Scene.

POST

https://moshpit.studio/api/v1/uploads/splat-images

Auth

All three headers are required:

Authorization: Bearer msk_YOUR_SECRET_KEY
X-Moshpit-Public-Key: mpk_YOUR_PUBLIC_KEY
X-Moshpit-External-User-Id: YOUR_HOST_USER_ID

Provision the external user first with PUT /api/v1/external-user.

REST API access

REST API access is included on Free, Pro, and Enterprise. Storage, Scene counts, and integration limits still apply.

Body

Send thumbnail, depth, or both:

{}

JSON

{
  "thumbnail": {
    "contentType": "image/webp",
    "fileSize": 482193
  },
  "depth": {
    "contentType": "image/jpeg",
    "fileSize": 718244
  }
}

Thumbnails accept image/jpeg, image/png, or image/webp. Depth maps accept image/jpeg. Each image may be at most 8 MB, and both images together may be at most 16 MB.

Success response

The response contains one object for each requested image:

{}

JSON

{
  "status": "success",
  "thumbnail": {
    "uploadUrl": "https://...",
    "fileUrl": "https://cdn.example.com/splat-images/external-user/thumbnail.webp",
    "expiresAt": "2026-05-20T12:05:00.000Z"
  },
  "depth": {
    "uploadUrl": "https://...",
    "fileUrl": "https://cdn.example.com/splat-images/external-user/depth.jpg",
    "expiresAt": "2026-05-20T12:05:00.000Z"
  }
}

Upload each requested image within five minutes:

PUT {uploadUrl}
Content-Type: image/webp
Content-Length: 482193
Cache-Control: public, max-age=31536000, immutable

Use the content type and byte count from the matching request object. Send the Cache-Control header exactly as shown because it is part of the signed upload request.

Then pass the returned URLs to POST /api/v1/splats:

{}

JSON

{
  "title": "Lobby scan",
  "splatUrl": "https://cdn.example.com/splats/external-user/scene.sog",
  "imageUrl": "{thumbnail.fileUrl}",
  "thumbnailDepthUrl": "{depth.fileUrl}"
}

imageUrl is required when you provide thumbnailDepthUrl. All URLs must belong to the same external user as the Scene upload.

Error responses

StatusCause
400Missing external user, invalid JSON, no image requested, unsupported type, or size limit
401Missing or invalid Bearer / public-key combination, including an inactive or unknown external user
403The integration owner's plan does not include REST API access
500Moshpit could not create a signed upload URL