---
title: "Product Material Change"
method: POST
path: "/v2/tool/material-swap"
tags: ["edit-workflow"]
---

# Product Material Change

`POST /v2/tool/material-swap`

Re-renders the masked region of the product photo in the material shown
by the reference image — matching its color, texture, pattern scale,
and orientation — while preserving the product's silhouette,
construction, seams, and shading, and keeping every region outside the
mask unchanged.

The request is processed asynchronously. Poll
`GET /v1/generations/{generation_id}` with the returned `generation_id`
until the generation is completed or failed.

Supply the product photo as either an `AssetIdentifier` reference
(`image_asset_identifier`) or the raw image bytes directly (`image`,
multipart requests only). Provide exactly one of the two forms;
supplying both, or neither, is rejected with a 400.

Supply the mask marking the region to re-material as either an
`AssetIdentifier` reference (`mask_asset_identifier`) or the raw mask
bytes directly (`mask`, multipart requests only). Provide exactly one
of the two forms. The mask must have the same pixel dimensions as the
product photo. White pixels mark the region to change; black pixels are
preserved. Alpha-only masks are also supported: opaque pixels mark the
region to change and transparent pixels are preserved.

Supply the material reference as either an `AssetIdentifier` reference
(`material_asset_identifier`) or the raw image bytes directly
(`material`, multipart requests only). Provide exactly one of the two
forms.

## Request body

- MaterialSwapRequest — Supply the product photo, the mask, and the material reference each as either an `AssetIdentifier` reference or (multipart requests only) raw image bytes; provide exactly one form per input. Supplying both forms of an input, or neither, is rejected with a 400.
  - `image_asset_identifier` AssetIdentifier — An identifier for an ideogram asset.
    - `asset_type` 'ASSET' | 'CANVAS_ASSET' | 'LAYERED_ASSET' | 'RESPONSE' | 'UPLOAD', required
    - `asset_id` string, required
  - `image` string, binary — The product photo to edit (max size 25MB), as raw bytes; only JPEG, PNG, and WEBP formats are supported. Multipart requests only. Provide exactly one of `image_asset_identifier` or `image`.
  - `mask_asset_identifier` AssetIdentifier — An identifier for an ideogram asset.
    - `asset_type` 'ASSET' | 'CANVAS_ASSET' | 'LAYERED_ASSET' | 'RESPONSE' | 'UPLOAD', required
    - `asset_id` string, required
  - `mask` string, binary — The mask marking the region of the product photo to change (max size 25MB), as raw bytes; only JPEG, PNG, and WEBP formats are supported. The mask must have the same pixel dimensions as the product photo. White pixels mark the region to change; black pixels are preserved. Alpha-only masks are also supported: opaque pixels mark the region to change and transparent pixels are preserved. Multipart requests only. Provide exactly one of `mask_asset_identifier` or `mask`.
  - `material_asset_identifier` AssetIdentifier — An identifier for an ideogram asset.
    - `asset_type` 'ASSET' | 'CANVAS_ASSET' | 'LAYERED_ASSET' | 'RESPONSE' | 'UPLOAD', required
    - `asset_id` string, required
  - `material` string, binary — The material reference image (max size 25MB), as raw bytes; only JPEG, PNG, and WEBP formats are supported. Only its material — color, texture, pattern scale, and orientation — is applied to the masked region. Multipart requests only. Provide exactly one of `material_asset_identifier` or `material`.
  - `aspect_ratio` string — The aspect ratio of the generated image. Defaults to the aspect ratio of the product photo when omitted, which preserves the original framing exactly. When a different ratio is requested, the scene is extended to fill the new shape rather than cropped, so part of the frame is newly generated. Supported values are `1:1`, `3:4`, `4:3`, `16:9`, and `9:16`.
  - `quality` 'LOW' | 'MEDIUM' | 'HIGH' — The quality tier for the image edit. Higher tiers may improve detail and take longer to complete.
  - `private` boolean — When true or omitted, the output is kept private to your account. Set to false to publish the output to the public feed. Enterprise accounts always generate privately.
  - `webhook_url` string, uri — HTTPS URL that Ideogram delivers the generated result to. Ideogram sends a JSON POST to this URL once all images for the request have finished generating. The body mirrors the synchronous generate response: `request_id`, `created`, and a `data` array containing every generated image (`url`, `prompt`, `resolution`, `seed`, `is_image_safe`). Each delivery is signed with Ed25519 and verifiable against the public keys at `https://api.ideogram.ai/v1/.well-known/jwks.json`. Must be HTTPS; private and loopback hosts and the cloud metadata service are rejected.

## Response `200`

Material swap accepted for asynchronous processing.

- MaterialSwapResponse — Acknowledgement that the material swap was accepted. Poll `GET /v1/generations/{generation_id}` for status and results.
  - `generation_id` string, required — URL-safe base64 ID accepted by the generation polling endpoint.

## Other responses

- `400` — Invalid input provided.
- `401` — Unauthorized.
- `402` — Insufficient credits or quota.
- `403` — Not authorized to create a material swap.
- `429` — Too many requests.

---

[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/3eb3216eed39/schema)
