---
title: "[beta] Create a fleet installer photo upload."
method: POST
path: "/fleet/installer/photo-uploads"
tags: ["Beta APIs"]
---

# \[beta\] Create a fleet installer photo upload.

`POST /fleet/installer/photo-uploads`

## Request

- Base URL: `https://api.samsara.com`
- URL: `https://api.samsara.com/fleet/installer/photo-uploads`
- Auth: HTTP bearer

Creates a fleet installer photo upload session and returns a presigned S3 PUT URL. Upload the file bytes directly to the presigned URL using the headers in uploadContext, then call POST /fleet/installer/photo-uploads/complete to finalize.

 <b>Rate limit:</b> 100 requests/min (learn more about rate limits <a href="https://developers.samsara.com/docs/rate-limits" target="_blank">here</a>).

To use this endpoint, select **Write Devices** under the Devices category when creating or editing an API token. <a href="https://developers.samsara.com/docs/authentication#scopes-for-api-tokens" target="_blank">Learn More.</a>
 

 **Submit Feedback**: Likes, dislikes, and API feature requests should be filed as feedback in our <a href="https://forms.gle/zkD4NCH7HjKb7mm69" target="_blank">API feedback form</a>. If you encountered an issue or noticed inaccuracies in the API documentation, please <a href="https://www.samsara.com/help" target="_blank">submit a case</a> to our support team.

## Request body

- FleetInstallerPhotoUploadsPostFleetInstallerPhotoUploadRequestBody: Request body for creating a fleet installer photo upload session.
  - `contentMd5` string, required: Base64-encoded MD5 of the file bytes. Signed into the presigned URL as Content-MD5; object storage verifies upload integrity on PUT. Must be exactly 24 characters (base64-encoded 16-byte MD5 digest).
  - `deviceId` string, required: Samsara device ID. The device must belong to the caller's organization.
  - `fileFormatType` 'imageJpeg' | 'imagePng', required: File format. Samsara maps this to the corresponding MIME type for the presigned URL. Valid values: `imageJpeg`, `imagePng`
  - `fileName` string, required: Original file name. Max 255 characters; printable characters only; no null bytes or path separators (/ or \).
  - `hardwareType` 'vehicleGateway' | 'assetGateway' | 'camera' | 'cameraConnector' | 'environmentalMonitor' | 'assetTag' | 'trackingLabel', required: Hardware category of the device being installed. Valid values: `vehicleGateway`, `assetGateway`, `camera`, `cameraConnector`, `environmentalMonitor`, `assetTag`, `trackingLabel`
  - `photoType` 'installPhoto' | 'assetPhoto', required: Purpose of the photo. Valid values: `installPhoto`, `assetPhoto`
  - `sizeBytes` integer, required: File size in bytes. Validated against the maximum allowed size (10 MB) and signed into the presigned URL as Content-Length.

## Response `200`

OK response.

- FleetInstallerPhotoUploadsPostFleetInstallerPhotoUploadResponseBody
  - `data` FleetInstallerPhotoUploadCreateDataResponseBody, required: Upload session with presigned S3 context. uploadContext is present only in the POST create response.
    - `contentMd5` string, required: Base64-encoded MD5 of the file bytes.
    - `createdAtTime` string, date-time, required: Session creation timestamp (RFC 3339).
    - `deviceId` string, required: Samsara device ID.
    - `fileFormatType` 'imageJpeg' | 'imagePng' | 'unknown', required: File format. Valid values: `imageJpeg`, `imagePng`, `unknown`
    - `fileName` string, required: Original file name supplied at session creation.
    - `hardwareType` 'vehicleGateway' | 'assetGateway' | 'camera' | 'cameraConnector' | 'environmentalMonitor' | 'assetTag' | 'trackingLabel' | 'unknown', required: Hardware category of the device. Valid values: `vehicleGateway`, `assetGateway`, `camera`, `cameraConnector`, `environmentalMonitor`, `assetTag`, `trackingLabel`, `unknown`
    - `id` string, required: Unique session UUID.
    - `photoType` 'installPhoto' | 'assetPhoto' | 'unknown', required: Purpose of the photo. Valid values: `installPhoto`, `assetPhoto`, `unknown`
    - `processingStatus` 'awaitingUpload' | 'processing' | 'finished' | 'unknown', required: Upload lifecycle state. Valid values: `awaitingUpload`, `processing`, `finished`, `unknown`
    - `sizeBytes` integer, required: File size in bytes.
    - `updatedAtTime` string, date-time, required: Timestamp of last state change (RFC 3339). Equals createdAtTime at session creation; updated when processingStatus changes.
    - `uploadContext` FleetInstallerPhotoUploadContextResponseBody, required: Presigned S3 PUT context returned on session creation.
      - `expiresAtTime` string, date-time, required: Presigned URL expiry (RFC 3339). The Step 2 PUT must complete before this time.
      - `headers` object, required: HTTP headers the client MUST include verbatim on the Step 2 PUT request. Keys use S3 HTTP header naming (Title-Case-With-Hyphens) and are not subject to Samsara naming conventions.
      - `uploadUrl` string, required: Presigned S3 PUT URL. Valid until expiresAtTime.

## Other responses

- `401`: Unauthorized response.
- `404`: Not Found response.
- `405`: Method Not Allowed response.
- `413`: Content Too Large response.
- `429`: Too Many Requests response.
- `500`: Internal Server Error response.
- `501`: Not Implemented response.
- `502`: Bad Gateway response.
- `503`: Service Unavailable response.
- `504`: Gateway Timeout response.
- `default`: Bad Request response.

---

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