---
title: "Confirm model upload"
method: POST
path: "/v1/models/uploads/{upload_id}/confirm"
tags: ["Models"]
---

# Confirm model upload

`POST /v1/models/uploads/{upload_id}/confirm`

Confirm a model upload after the S3 upload completes.

This is step 3 of the presigned URL workflow. Call this after
uploading the model archive to the presigned URL.

The service will:
1. Verify the S3 object exists
2. Validate the archive structure
3. Create the model record

## Path parameters

- `upload_id` string, required

## Request body

- ConfirmModelUploadRequest — Request to confirm a model upload after S3 upload completes. Optional fields for integrity verification: - etag: S3 ETag returned from PUT response (recommended) - file_size_bytes: Expected file size for validation
  - `etag` string, nullable — S3 ETag from upload response for integrity check
  - `file_size_bytes` integer, nullable — Expected file size for validation

## Response `200`

Successful Response

- ConfirmModelUploadResponse — Response from confirming a model upload.
  - `success` boolean, required — Whether upload and validation succeeded
  - `upload_id` string, required — The upload ID
  - `model_id` string, nullable — Created model ID if successful
  - `validation_status` 'pending' | 'passed' | 'failed', required — Validation status
  - `validation_errors` string[], nullable — Validation errors if any
  - `s3_archive_url` string, nullable — S3 URL of the archive
  - `message` string, nullable — Additional status message

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found
- `422` — Validation Error
- `500` — Internal Server Error

---

[API](https://skmtc.net/mixpeek/apis/mixpeek-api.md) · [All operations](https://skmtc.net/mixpeek/apis/mixpeek-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/mixpeek/mixpeek-api/versions/04b379bdbb7c/schema)
