This page is confidential. Custom Models launches publicly on April 22, 2026 at 12 noon ET.
Ideogram Custom Branded Models API

Custom Model Training API

Create datasets, upload training images, train models, and generate at scale. All from a few API calls.

Overview

Custom model training lets you fine-tune an Ideogram model on your own dataset of images via the API. Once training completes, you can generate images using your trained model by passing its custom_model_uri to the Generate endpoint.

1 Create a dataset
2 Upload images
3 Train model
4 Check status
5 Generate

Endpoint reference

Endpoint Method Description
/datasets GET List all datasets for the authenticated user
/datasets POST Create a new dataset
/datasets/{dataset_id}/upload_assets POST Upload images and captions to a dataset
/datasets/{dataset_id}/train_model POST Start training a model from a dataset
/models GET List custom models (owned or shared)
/models/{model_id} GET Get details for a specific model

Step 1: Create a dataset

import requests

response = requests.post(
  "https://api.ideogram.ai/datasets",
  headers={"Api-Key": "<apiKey>"},
  json={"name": "My Training Dataset"}
)
dataset = response.json()
dataset_id = dataset["dataset_id"]
print(f"Created dataset: {dataset_id}")

Step 2: Upload training images

Upload images (JPEG, PNG, WebP), optional .txt caption sidecar files, or ZIP archives containing both.

Minimum: 10 images per dataset
Maximum: 100 images per dataset
Captions: Matched by filename stem (e.g. sunset.txt captions sunset.jpg)
Tip: Upload a ZIP file for larger datasets. If images are very large, upload in batches to avoid timeouts.
import requests
import glob

files = [("files", open(f, "rb")) for f in glob.glob("training_images/*.jpg")]

response = requests.post(
  f"https://api.ideogram.ai/datasets/{dataset_id}/upload_assets",
  headers={"Api-Key": "<apiKey>"},
  files=files
)
result = response.json()
print(f"Uploaded {result['success_count']}/{result['total_count']} images")

Step 3: Train the model

Once your dataset has enough images, start training by giving your model a name.

response = requests.post(
  f"https://api.ideogram.ai/datasets/{dataset_id}/train_model",
  headers={"Api-Key": "<apiKey>"},
  json={"model_name": "my-custom-model"}
)
training = response.json()
model_id = training["model_id"]
print(f"Training started: {training['training_status']}")

Step 4: Check training status

Poll the model details endpoint to check when training completes.

CREATING DRAFT TRAINING COMPLETED
import time

while True:
  response = requests.get(
    f"https://api.ideogram.ai/models/{model_id}",
    headers={"Api-Key": "<apiKey>"}
  )
  model = response.json()["model"]
  print(f"Status: {model['status']}")

  if model["status"] == "COMPLETED":
    print(f"Model ready! URI: {model.get('custom_model_uri')}")
    break
  elif model["status"] == "ERRORED":
    print("Training failed.")
    break

  time.sleep(60)

Step 5: Generate with your model

Once training is complete and is_available_for_generation is true, use the custom_model_uri from the model details to generate images.

response = requests.post(
  "https://api.ideogram.ai/v1/ideogram-v3/generate",
  headers={"Api-Key": "<apiKey>"},
  data={
    "prompt": "A photo in my custom style",
    "custom_model_uri": "model/my-custom-model/version/1",
    "rendering_speed": "DEFAULT"
  }
)
result = response.json()
if response.status_code == 200:
  print(result["data"][0]["url"])

Tips for better results

  • Use high-quality images that clearly represent the style or subject you want the model to learn.
  • Add captions to guide the model on what each image represents. Captions are optional but improve alignment.
  • Use consistent subjects across your training images for best results with style transfer.

Ready to train your first model?