> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mobilerun.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Confirm successful app upload

> Verifies the uploaded files in R2 and sets the app version status to available. Idempotent: replaying confirmation for an already-available version returns the same successful response without re-verifying the files.



## OpenAPI

````yaml /api-reference/phones.yaml post /apps/{id}/confirm-upload
openapi: 3.1.0
info:
  title: Phones
  version: v1
servers:
  - description: Droidrun Cloud API
    url: https://api.mobilerun.ai/v1
security:
  - bearerAuth: []
paths:
  /apps/{id}/confirm-upload:
    post:
      tags:
        - Apps Cloud Storage
      summary: Confirm successful app upload
      description: >-
        Verifies the uploaded files in R2 and sets the app version status to
        available. Idempotent: replaying confirmation for an already-available
        version returns the same successful response without re-verifying the
        files.
      operationId: confirmUploadPublic
      parameters:
        - in: path
          name: id
          required: true
          schema:
            format: uuid
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  message:
                    type: string
                  success:
                    enum:
                      - true
                    type: boolean
                required:
                  - success
                  - message
                type: object
          description: Upload confirmed
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConfirmUploadBadRequest'
          description: >-
            Bad request. Upload-limit failures are machine-readable via a stable
            `error` code: `APP_FILE_TOO_LARGE` (a file exceeds the per-file cap)
            or `APP_STORAGE_QUOTA_EXCEEDED` (the upload would exceed the org
            quota). Other bad requests use a generic `{ message }` body.
        '401':
          description: Unauthorized
        '409':
          description: Conflict
        '500':
          description: Internal Server Error
      x-codeSamples:
        - lang: JavaScript
          source: >-
            import Mobilerun from '@mobilerun/sdk';


            const client = new Mobilerun({
              apiKey: process.env['MOBILERUN_CLOUD_API_KEY'], // This is the default and can be omitted
            });


            const response = await
            client.apps.confirmUpload('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e');


            console.log(response.message);
        - lang: Python
          source: |-
            import os
            from mobilerun_sdk import Mobilerun

            client = Mobilerun(
                api_key=os.environ.get("MOBILERUN_CLOUD_API_KEY"),  # This is the default and can be omitted
            )
            response = client.apps.confirm_upload(
                "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
            )
            print(response.message)
components:
  schemas:
    ConfirmUploadBadRequest:
      anyOf:
        - $ref: '#/components/schemas/AppFileTooLargeError'
        - $ref: '#/components/schemas/AppStorageQuotaExceededError'
        - $ref: '#/components/schemas/RequestValidationError'
        - $ref: '#/components/schemas/BadRequestError'
    AppFileTooLargeError:
      properties:
        actualBytes:
          description: Real R2 object size of the offending file, in bytes
          type: number
        error:
          enum:
            - APP_FILE_TOO_LARGE
          type: string
        fileName:
          description: Name of the file that exceeded the per-file cap
          type: string
        maxFileBytes:
          description: Per-file cap that was exceeded, in bytes
          type: number
      required:
        - error
        - fileName
        - actualBytes
        - maxFileBytes
      type: object
    AppStorageQuotaExceededError:
      properties:
        availableBytes:
          description: >-
            Pre-upload remaining headroom (quotaBytes − usedBytes, floored at
            0), in bytes
          type: number
        error:
          enum:
            - APP_STORAGE_QUOTA_EXCEEDED
          type: string
        quotaBytes:
          description: Org’s effective storage quota, in bytes
          type: number
        uploadBytes:
          description: Real R2 size of the upload being confirmed, in bytes
          type: number
        usedBytes:
          description: >-
            Bytes already consumed by the org’s other versions (this upload
            excluded)
          type: number
      required:
        - error
        - quotaBytes
        - usedBytes
        - uploadBytes
        - availableBytes
      type: object
    RequestValidationError:
      properties:
        error:
          properties:
            message:
              type: string
            name:
              type: string
          required:
            - name
            - message
          type: object
        success:
          enum:
            - false
          type: boolean
      required:
        - success
        - error
      type: object
    BadRequestError:
      properties:
        message:
          type: string
      required:
        - message
      type: object
  securitySchemes:
    bearerAuth:
      bearerFormat: Opaque
      description: Bearer token via Authorization header
      scheme: bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.