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

# 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

---

[API](https://skmtc.net/mobilerun/apis/workflows.md) · [All operations](https://skmtc.net/mobilerun/apis/workflows/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/mobilerun/workflows/revisions/1bc499aa8f99/schema)
