Skip to main content
ideogram avatar

Ideogram V4 API

ideogram/ideogram-v4

Generate images from a text prompt with industry-leading accurate, legible in-image text for logos, posters, and signage.

0.06 per megapixel of image

Model Input

Input

The text prompt describing the image to generate. Put any words you want rendered inside the image in quotes.

Magic Prompt: automatically enriches the prompt before generation. None uses the prompt as written; Large applies the most enrichment for the highest-quality result.

The size of the generated image. Use a preset string (e.g. 'landscape_16_9') or a custom {width, height} object.

The speed/quality/cost tradeoff. TURBO is fastest and cheapest, BALANCED is the default, QUALITY is best but slowest and most expensive. Affects both speed and cost.

The acceleration level to use.

The same seed and the same prompt given to the same version of the model will output the same image every time.

Safety checker can only be disabled on API call

The format of the generated image.

Min: 1 - Max: 4

The number of images to generate. Each generated image is billed.

You need to be logged in to run this model and view results.
Log in

Model Output

Output

Generated image output
Generated in 29.013 seconds
Logs (1 lines)

Model Example Requests

Examples

Example output 1Example output 2Example output 3

Ideogram V4 API

Ideogram V4 is a text-to-image AI model by ideogram. On ModelRunner it runs through a REST API or via MCP from any AI assistant, at $0.06 per megapixel.

POST https://queue.modelrunner.run/ideogram/ideogram-v4

cURL

# Submit a request to the queue. Input fields go at the top level of the
# body. The optional reserved "metadata" object holds your own flat string
# tags — stored on the request, never sent to the model; filter later with
# GET https://queue.modelrunner.run/requests?metadata=<url-encoded JSON>.
curl -X POST https://queue.modelrunner.run/ideogram/ideogram-v4 \
  -H "Authorization: Key $MRUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "a vintage coffee shop storefront with a hand-painted sign reading DAWN ROAST",
    "image_size": "square_hd",
    "num_images": 1,
    "acceleration": "none",
    "output_format": "jpeg",
    "expansion_model": "Medium",
    "rendering_speed": "BALANCED",
    "enable_safety_checker": true,
    "metadata": {
      "project": "my-project"
    }
  }'
# → { "request_id": "...", "status_url": "...", "response_url": "..." }

# Poll status_url until "COMPLETED", then fetch the result
curl "https://queue.modelrunner.run/ideogram/ideogram-v4/requests/$REQUEST_ID/status" \
  -H "Authorization: Key $MRUN_API_KEY"
curl "https://queue.modelrunner.run/ideogram/ideogram-v4/requests/$REQUEST_ID" \
  -H "Authorization: Key $MRUN_API_KEY"

JavaScript

import { modelrunner } from "@modelrunner/client";

const result = await modelrunner.subscribe("ideogram/ideogram-v4", {
  input: {
    "prompt": "a vintage coffee shop storefront with a hand-painted sign reading DAWN ROAST",
    "image_size": "square_hd",
    "num_images": 1,
    "acceleration": "none",
    "output_format": "jpeg",
    "expansion_model": "Medium",
    "rendering_speed": "BALANCED",
    "enable_safety_checker": true
  },
});
console.log(result);

Python

import os
import requests

headers = {"Authorization": f"Key {os.environ['MRUN_API_KEY']}"}

submitted = requests.post(
    "https://queue.modelrunner.run/ideogram/ideogram-v4",
    headers=headers,
    json={
      "prompt": "a vintage coffee shop storefront with a hand-painted sign reading DAWN ROAST",
      "image_size": "square_hd",
      "num_images": 1,
      "acceleration": "none",
      "output_format": "jpeg",
      "expansion_model": "Medium",
      "rendering_speed": "BALANCED",
      "enable_safety_checker": true
    },
).json()

# Poll submitted["status_url"] until "COMPLETED", then:
result = requests.get(submitted["response_url"], headers=headers).json()

Input parameters

NameTypeRequiredDescription
promptstringyesThe text prompt describing the image to generate. Put any words you want rendered inside the image in quotes.
expansion_modelenumnoMagic Prompt: automatically enriches the prompt before generation. None uses the prompt as written; Large applies the most enrichment for the highest-quality result. Default: "Medium".
image_sizeenumnoThe size of the generated image. Use a preset string (e.g. 'landscape_16_9') or a custom {width, height} object. Default: "square_hd".
rendering_speedenumnoThe speed/quality/cost tradeoff. TURBO is fastest and cheapest, BALANCED is the default, QUALITY is best but slowest and most expensive. Affects both speed and cost. Default: "BALANCED".
accelerationenumnoThe acceleration level to use. Default: "none".
seedintegernoThe same seed and the same prompt given to the same version of the model will output the same image every time.
enable_safety_checkerbooleannoIf set to true, the safety checker will be enabled. Default: true.
output_formatenumnoThe format of the generated image. Default: "jpeg".
num_imagesintegernoThe number of images to generate. Each generated image is billed. Default: 1.

Machine-readable: OpenAPI schema · llms.txt

Use Ideogram V4 from Claude & Cursor (MCP)

Point Claude Code, Claude Desktop, Cursor, or any MCP client at the ModelRunner MCP server and Ideogram V4 becomes a tool your assistant can call directly — it authorizes via OAuth (no API key in config) and runs this model with the run_model tool using the endpoint ideogram/ideogram-v4.

MCP client config (Claude Desktop, Cursor)

{
  "mcpServers": {
    "modelrunner": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.modelrunner.run/mcp"]
    }
  }
}

Claude Code

claude mcp add --transport http modelrunner https://mcp.modelrunner.run/mcp

Then ask your assistant, for example: “Run ideogram/ideogram-v4 on ModelRunner to generate image”. MCP setup guide.

Model Details

Model Details

Ideogram V4 turns a text prompt into a high-quality image, and its standout strength is one most image models still get wrong: rendering accurate, legible text inside the image. Ask for a logo, a movie poster, a product label, or a street sign with real words on it, and it keeps the spelling, layout, and typography coherent. It also handles general photorealistic and illustrative generation across a wide range of styles and aspect ratios.

## Best for - Brand logos and wordmarks where the lettering must be spelled and laid out correctly - Posters, ad creative, book covers, and album art built around a headline or tagline - Signage, storefronts, and menus that read as real text in the scene - Product packaging and labels with legible names and copy - Typographic and graphic-design compositions where letters must stay sharp

## Choose another model when - You want to transform or restyle an existing image rather than generate from a prompt — use the image-to-image variant `ideogram/ideogram-v4/image-to-image` - You need long paragraphs of body text or precise document layout — a text-to-image model (including this one) is not a substitute for a real design or typesetting tool

## Tips - Put the exact words you want rendered in quotes in your prompt, e.g. a poster that reads `"GRAND OPENING"` - Keep on-image text short and specific; long passages are harder to render perfectly - Pick an `image_size` preset that matches the medium — `portrait_4_3` for posters, `landscape_16_9` for banners

## Advanced Configuration

### rendering_speed Controls the speed/quality/cost tradeoff. `TURBO` is the fastest and cheapest, `BALANCED` (the default) is the middle ground, and `QUALITY` is the best but slowest and most expensive. It affects both how long generation takes **and** how much each image costs, so choose `TURBO` for quick drafts and `QUALITY` for final hero images.

```js input: { prompt: "...", rendering_speed: "QUALITY" } ```

### expansion_model This is the "Magic Prompt" feature, which automatically enriches your prompt with extra descriptive detail before generation. Options are `None`, `Medium` (the default), and `Large` — `Large` applies the most enrichment for the most detailed result, while `None` uses your prompt exactly as written for full literal control. Use a larger value when your prompt is short or sparse, and `None` when you want precise adherence.

```js input: { prompt: "...", expansion_model: "Large" } ```

To run via the ModelRunner JavaScript client: ```js import { modelrunner } from "@modelrunner/client";

const result = await modelrunner.subscribe("ideogram/ideogram-v4", { input: { prompt: 'a vintage travel poster that reads "VISIT MARS"', image_size: "portrait_4_3", rendering_speed: "QUALITY", expansion_model: "Large", }, }); ```