---
title: Model Upload | Runware Docs
url: https://runware.ai/docs/platform/model-upload
description: Upload and manage your custom AI models on the Runware platform. Integrate your own checkpoints, LoRAs, and other model types into your workflow.
relatedDocuments:
  - https://runware.ai/docs/platform/model-search
  - https://runware.ai/docs/platform/image-upload
---
## Introduction

The Model Upload API lets you integrate **custom models** into the Runware platform. Upload your own checkpoints, LoRAs, or other supported model types and use them in generation tasks just like any other model on the platform.

Uploaded models are automatically **optimized for the Sonic Inference Engine®**, enhancing speed and efficiency without compromising output quality. Once processed, models are distributed across our infrastructure and can be referenced by their assigned identifiers in any API request.

### Supported model categories

- **Checkpoints**: Base models across multiple architectures including Stable Diffusion (1.x, 2.x, XL, 3.x) and FLUX.
- **LoRAs**: Low-Rank Adaptation models for style and concept fine-tuning.
- **LyCORIS**: An advanced alternative to LoRA for model fine-tuning.
- **VAE**: Variational Autoencoder models for image encoding and decoding.
- **Embeddings**: Textual Inversion embeddings for custom concepts and styles.

### Visibility and versioning

You have full control over who can access your models. Set them as **public** (accessible to all platform users) or **private** (restricted to your organization). The API also supports **multiple versions** of the same model, allowing you to iterate on weights or configurations while maintaining a clean version history.

### Storage pricing

Model upload is currently in **beta and free of charge**. There are no costs for uploading or storing models during this period.

After the beta period, storage will be charged at **$0.05 per GB per month**, rounded up to the nearest GB and calculated daily. We will not retroactively charge for storage used during the beta. A positive account balance is required to upload new models.

## Request

Our API always accepts an array of objects as input, where each object represents a **specific task to be performed**. The structure of the object varies depending on the type of the task. For this section, we will focus on the parameters related to the **model upload task**.

The following JSON snippet shows the basic structure of a request object.

```json
[
  {
    "taskType": "modelUpload",
    "taskUUID": "b92ea202-349f-4560-adae-abb55a8146ee",
    "category": "checkpoint",
    "architecture": "flux",
    "format": "safetensors",
    "air": "myorg:42@1",
    "uniqueIdentifier": "abc123def456",
    "name": "My Custom Model",
    "version": "v1",
    "downloadURL": "https://example.com/models/my-model.safetensors",
    "private": true
  }
]
```

---

### [taskType](#request-tasktype)

- **Type**: `const:modelUpload`
- **Required**: true
- **Value**: `modelUpload`

The type of task to perform.

### [taskUUID](#request-taskuuid)

- **Type**: `string`
- **Format**: `UUID v4`

UUID v4 identifier for tracking tasks and matching async responses. Must be unique per task.

### [category](#request-category)

- **Type**: `string`
- **Required**: true

Category of the model.

**Allowed values**: `checkpoint` `lora` `lycoris` `vae` `embeddings`

### [format](#request-format)

- **Type**: `string`
- **Required**: true

Format of the model file.

**Allowed values**: `safetensors`

### [air](#request-air)

- **Type**: `string`

Artificial Intelligence Resource identifier.

### [uniqueIdentifier](#request-uniqueidentifier)

- **Type**: `string`

Unique identifier for the model.

### [name](#request-name)

- **Type**: `string`
- **Required**: true

Name of the model.

### [version](#request-version)

- **Type**: `string`
- **Required**: true

Version of the model.

### [downloadURL](#request-downloadurl)

- **Type**: `string`
- **Required**: true
- **Format**: `URI`

URL where the model file is hosted.

### [private](#request-private)

- **Type**: `boolean`
- **Default**: `false`

Whether the model should be private.

### [heroImageURL](#request-heroimageurl)

- **Type**: `string`
- **Format**: `URI`

URL of the hero image.

### [tags](#request-tags)

- **Type**: `array of strings`

Tags associated with the model.

### [shortDescription](#request-shortdescription)

- **Type**: `string`

Short description of the model.

### [comment](#request-comment)

- **Type**: `string`

Additional comments or notes.

### Checkpoints

When `category` is set to `checkpoint`, the following additional parameters are available:

### [type](#request-type)

- **Type**: `string`

Type of the model (specific to category).

**Allowed values**: `base` `inpainting` `refiner`

### [architecture](#request-architecture)

- **Type**: `string`
- **Required**: true

Architecture of the model.

**Allowed values**: `sd1x` `sd1lcm` `sd1distilled` `sdhyper` `sd2x` `sdxl` `sdxllcm` `sdxldistilled` `sdxlturbo` `sdxlhyper` `sdxllightning` `illustrious` `noobai` `pony` `flux1s` `flux1d` `fluxkontextdev` `z_image` `z_image_turbo`

### [defaultScheduler](#request-defaultscheduler)

- **Type**: `string`

Default scheduler.

### [defaultSteps](#request-defaultsteps)

- **Type**: `integer`
- **Min**: `1`

Default number of inference steps.

### [defaultCFG](#request-defaultcfg)

- **Type**: `float`
- **Min**: `0`

Default classifier-free guidance scale.

### [defaultStrength](#request-defaultstrength)

- **Type**: `float`
- **Min**: `0`
- **Max**: `1`

Default strength for img2img.

### LoRAs

When `category` is set to `lora`, the following additional parameters are available:

### [type](#request-type)

- **Type**: `string`

Type of the model (specific to category).

**Allowed values**: `positive` `negative`

### [architecture](#request-architecture)

- **Type**: `string`
- **Required**: true

Architecture of the model.

**Allowed values**: `sd1x` `sd1lcm` `sd1distilled` `sdhyper` `sd2x` `sd3` `sdxl` `sdxllcm` `sdxldistilled` `sdxlturbo` `sdxlhyper` `sdxllightning` `illustrious` `noobai` `pony` `flux1s` `flux1d` `fluxkontextdev` `flux_2_dev` `flux2klein_base_4b` `flux2klein_4b` `flux2klein_base_9b` `flux2klein_9b` `z_image` `z_image_turbo` `auraflow` `hidreamfast` `hidreamdev` `hidreamfull` `qwen_image` `qwen_image_edit` `qwen_image_edit_plus` `qwen_image_layered` `wan_2_2_a14b_t2v` `wan_2_2_a14b_i2v`

### [defaultWeight](#request-defaultweight)

- **Type**: `float`

Default weight for the model.

### [positiveTriggerWords](#request-positivetriggerwords)

- **Type**: `string`

List of positive trigger words.

### LyCORIS

When `category` is set to `lycoris`, the following additional parameters are available:

### [type](#request-type)

- **Type**: `string`

Type of the model (specific to category).

**Allowed values**: `positive` `negative`

### [architecture](#request-architecture)

- **Type**: `string`
- **Required**: true

Architecture of the model.

**Allowed values**: `sd1x` `sd1lcm` `sd1distilled` `sdhyper` `sd2x` `sd3` `sdxl` `sdxllcm` `sdxldistilled` `sdxlturbo` `sdxlhyper` `sdxllightning` `illustrious` `noobai` `pony` `flux1s` `flux1d` `fluxkontextdev` `flux_2_dev` `flux2klein_base_4b` `flux2klein_4b` `flux2klein_base_9b` `flux2klein_9b` `z_image` `z_image_turbo` `auraflow` `hidreamfast` `hidreamdev` `hidreamfull` `qwen_image` `qwen_image_edit` `qwen_image_edit_plus` `qwen_image_layered` `wan_2_2_a14b_t2v` `wan_2_2_a14b_i2v`

### [defaultWeight](#request-defaultweight)

- **Type**: `float`

Default weight for the model.

### [positiveTriggerWords](#request-positivetriggerwords)

- **Type**: `string`

List of positive trigger words.

### VAE

When `category` is set to `vae`, the following additional parameters are available:

### [architecture](#request-architecture)

- **Type**: `string`
- **Required**: true

Architecture of the model.

**Allowed values**: `sd1x` `sd1lcm` `sd1distilled` `sdhyper` `sdxl` `sdxllcm` `sdxldistilled` `sdxlturbo` `sdxlhyper` `sdxllightning` `illustrious` `noobai` `pony`

### Embeddings

When `category` is set to `embeddings`, the following additional parameters are available:

### [type](#request-type)

- **Type**: `string`

Type of the model (specific to category).

**Allowed values**: `positive` `negative`

### [architecture](#request-architecture)

- **Type**: `string`
- **Required**: true

Architecture of the model.

**Allowed values**: `sd1x` `sd1lcm` `sd1distilled` `sdhyper` `sdxl` `sdxllcm` `sdxldistilled` `sdxlturbo` `sdxlhyper` `sdxllightning` `illustrious` `noobai` `pony`

## Response

The API **streams a sequence of status messages** as your model progresses through the upload pipeline. Each message uses the same structure but indicates the current processing phase:

1. **Validated**: Model parameters and configuration have been verified.
2. **Downloaded**: Model file has been retrieved from the provided URL.
3. **Optimized**: Model has been optimized for the Sonic Inference Engine.
4. **Stored**: Model has been uploaded to distributed storage.
5. **Ready**: Model is deployed and available for use in generation tasks.

```json
{
  "data": [
    {
      "taskType": "modelUpload",
      "taskUUID": "b92ea202-349f-4560-adae-abb55a8146ee",
      "status": "ready",
      "message": "Model successfully deployed and ready for use.",
      "air": "myorg:42@1"
    }
  ]
}
```

---

### [taskType](#response-tasktype)

- **Type**: `string`
- **Value**: `modelUpload`

Identifier for the type of task being performed

### [taskUUID](#response-taskuuid)

- **Type**: `string`
- **Required**: true
- **Format**: `UUID v4`

UUID v4 identifier for tracking tasks and matching async responses. Must be unique per task.

### [status](#response-status)

- **Type**: `string`
- **Required**: true

Status of the upload operation phase.

**Possible values**: `validated` `downloaded` `optimized` `stored` `ready` `failed`

### [message](#response-message)

- **Type**: `string`
- **Required**: true

Status message or error details.

### [air](#response-air)

- **Type**: `string`

The AIR identifier of the uploaded model.