---
title: "Upload assets to a dataset"
method: POST
path: "/datasets/{dataset_id}/upload_assets"
tags: ["datasets"]
---

# Upload assets to a dataset

`POST /datasets/{dataset_id}/upload_assets`

Upload image assets to a dataset for model training. Accepts individual images (JPEG, PNG, WebP), optional .txt caption sidecar files, and/or ZIP archives containing images and captions. A dataset can contain up to 100 images.

## Path parameters

- `dataset_id` string, required

## Response `200`

Upload summary

- UploadDatasetAssetsResponse
  - `total_count` integer, required — Total number of images processed.
  - `success_count` integer, required — Number of images successfully uploaded.
  - `failure_count` integer, required — Number of images that failed to upload.
  - `successful_assets` DatasetUploadSucceededAsset[] — Details of successfully uploaded assets.
    - `asset_identifier` AssetIdentifier, required — An identifier for an ideogram asset.
      - `asset_type` 'ASSET' | 'CANVAS_ASSET' | 'LAYERED_ASSET' | 'RESPONSE' | 'UPLOAD', required
      - `asset_id` string, required
    - `file_name` string, nullable — Original filename of the uploaded file. For a caption sidecar (.txt or .json) this is the sidecar's filename. A single image therefore yields one entry for the image plus one per caption file.
  - `failed_assets` DatasetUploadFailedAsset[] — Details of assets that failed to upload.
    - `file_name` string, nullable — Original filename of the failed image.
    - `failure_reason` 'FAILED_SAFETY_CHECK' | 'FILE_TOO_LARGE' | 'INTERNAL_ERROR' | 'INVALID_CAPTION' | 'INVALID_CAPTION_JSON' | 'INVALID_IMAGE' | 'INVALID_ZIP' | 'TOO_MANY_IMAGES', required — Reason why an asset failed to upload.

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `404` — Dataset not found

## Changes

- **2026-09-02** `1429d75daa36` — 3 breaking, 1 info
  - the `successful_assets/items/asset_identifier` response's property type changed from `object` to no type for status `200`
  - removed the required property `successful_assets/items/asset_identifier/asset_id` from the response with the `200` status
  - removed the required property `successful_assets/items/asset_identifier/asset_type` from the response with the `200` status
  - added `#/components/schemas/AssetIdentifier` to the `successful_assets/items/asset_identifier` response property `allOf` list for the response status `200`

[Change history](https://skmtc.dev/ideogram/apis/ideogram-openapi-3-0/changes/datasets/:dataset_id/upload_assets/post.md)

---

[API](https://skmtc.dev/ideogram/apis/ideogram-openapi-3-0.md) · [All operations](https://skmtc.dev/ideogram/apis/ideogram-openapi-3-0/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/ideogram/ideogram-openapi-3-0/revisions/1429d75daa36/schema)
