---
title: "Create a signed R2 upload URL for an app"
method: POST
path: "/apps/create-signed-upload-url"
tags: ["Apps"]
---

# Create a signed R2 upload URL for an app

`POST /apps/create-signed-upload-url`

Creates or updates an app and returns pre-signed Cloudflare R2 upload URLs for each file

## Request body

- object
  - `bundleId` string, required
  - `platform` 'android' | 'ios'
  - `displayName` string, required
  - `versionCode` number, required
  - `versionName` string, required
  - `country` string — Country code for Search Results
  - `description` string
  - `iconURL` union
    - string
    - string, uri
    - string
  - `targetSdk` number
  - `developerName` string
  - `files` object[], required
    - `fileName` string, required
    - `contentType` 'application/vnd.android.package-archive' | 'application/octet-stream' | 'application/zip', required
    - `sha256` string

## Response `200`

Signed upload URL created successfully

- object
  - `versionId` string, uuid, required — App version ID in the database
  - `appId` string, uuid, required — App ID in the database
  - `r2UploadUrls` object[], required — Pre-signed Cloudflare R2 URLs for uploading app files
    - `fileName` string, required
    - `r2UploadUrl` string, uri, required

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `500` — Internal Server Error

## Changes

- **2026-07-07** `d5d1e5ee8188` — 2 warning
  - changed the pattern of the request property `files/items/fileName` from `^[^/\\]+\.(apk|xapk|apks)$/i` to `^[^/\\]+\.(apk|xapk|apks|ipa)$/i`
  - removed the request property `sizeBytes`
- **2026-06-19** `ec76cd771e68` — 3 breaking, 1 warning, 5 info
  - request property `files/items/contentType` was restricted to a list of enum values
  - added the pattern `^[^/\\]+\.(apk|xapk|apks)$/i` to the request property `files/items/fileName`
  - added the pattern `^[a-zA-Z][a-zA-Z0-9_]*(\.[a-zA-Z][a-zA-Z0-9_-]*)+$` to the request property `bundleId`
  - the `bundleId` request property's maxLength was set to `255`
  - …5 more
- **2026-05-30** `51d2493ba0f4` — 1 info
  - endpoint added
- **2026-05-30** `d06ce0f3c00d` — 1 breaking
  - api path removed without deprecation
- **2026-05-08** `8cacdbf9c6f5` — 6 breaking, 4 warning, 5 info
  - added the new required request property `bundleId`
  - the request property `files/items/contentType` became required
  - the `displayName` request property's minLength was increased from `0` to `1`
  - the `files/items/contentType` request property's minLength was increased from `0` to `1`
  - …11 more

[Change history](https://skmtc.dev/droidrun/apis/droidrun-cloud/changes/apps/create-signed-upload-url/post.md)

---

[API](https://skmtc.dev/droidrun/apis/droidrun-cloud.md) · [All operations](https://skmtc.dev/droidrun/apis/droidrun-cloud/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/droidrun/droidrun-cloud/revisions/b6fd8aed4bf4/schema)
