---
title: "Get presigned upload URL"
method: POST
path: "/v1/apps/{app_id}/deploy/upload-url"
tags: ["Apps"]
---

# Get presigned upload URL

`POST /v1/apps/{app_id}/deploy/upload-url`

Generate a presigned S3 PUT URL so the CLI can upload a bundle zip directly.
Pass the returned `bundle_s3_key` to the deploy endpoint.

## Path parameters

- `app_id` string, required

## Request body

- UploadUrlRequest
  - `filename` string, required — Zip filename (e.g. 'my-app-v2.zip')
  - `content_type` string

## Response `200`

Successful Response

- UploadUrlResponse
  - `upload_url` string, required — Presigned S3 PUT URL
  - `bundle_s3_key` string, required — S3 key to pass back in DeployRequest
  - `expires_in` integer — URL expiry in seconds

## 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)
