---
title: "Create an app upload"
method: POST
path: "/api/uploads"
tags: ["Uploads"]
---

# Create an app upload

`POST /api/uploads`

## Request

- Base URL: `https://aximo.autify.com`
- URL: `https://aximo.autify.com/api/uploads`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/autify/apis/aximo-api/docs/api/uploads/post.ts> (a function with typed inputs; its response is checked against the schema)

Creates an upload record and returns a presigned URL for uploading the app binary.

**Flow:**
1. Call this endpoint to get `uploadId` and `presignedUrl`.
2. `PUT` the binary file to `presignedUrl`.
3. Call `POST /api/uploads/{uploadId}/submit` to start processing.
4. Poll `GET /api/uploads/{uploadId}` until `status` is `succeeded`.
5. Use the `uploadArn` token in `POST /api/sessions` to start a mobile test.

## Request body

- object
  - `fileName` string, required: Original file name. Must end in `.apk`, `.ipa`, or `.zip` (an iOS app bundle; requires `platform: IOS`); anything else is rejected with 400.
  - `fileSize` integer: File size in bytes (informational).
  - `platform` 'ANDROID' | 'IOS': Required for `.zip` files, which are iOS only; ignored for `.apk` and `.ipa`.

## Response `201`

Upload record created.

- object
  - `uploadId` string, uuid, required
  - `presignedUrl` string, required: URL to PUT the binary file to.
  - `fileType` 'ANDROID_APP' | 'IOS_APP', required

## Other responses

- `400`: Invalid request body.
- `401`: Missing or invalid API key.
- `429`: Rate limit exceeded — e.g. the daily session limit was reached for the organization, or too many API requests were sent in a short window (retry after the number of seconds in the `Retry-After` header).
- `500`: Unexpected server error.

---

[API](https://skmtc.dev/autify/apis/aximo-api.md) - [All operations](https://skmtc.dev/autify/apis/aximo-api/llms.txt) - [OpenAPI document](https://skmtc.dev/autify/apis/aximo-api/revisions/590722011284?raw)
