# Ideogram v3 Reframe (reframe) > Ideogram v3 Reframe re-crops a still image to another shape and fills the newly exposed areas with matching generated content. Status: roasOS API v1.1. Catalog `model-catalog@2026-10-06.v5`, pricing `customer-pricing@2026-11-05.v15`. The endpoint `POST /v1/reframe/ideogram-v3` is live. `POST /v1/generations` has no `reframe` type, so this endpoint is the only path to this model. ## Endpoint POST https://api.roasos.com/v1/reframe/ideogram-v3 Auth: Authorization: Bearer roasos_sk_… (scope api:write). Idempotency-Key required. quote_only / quote_id / webhook_url as in https://docs.roasos.com/llms.txt. ## Good at Take one product shot to every placement size you need. The price is per IMAGE, and `num_images` multiplies it. $0.03 with TURBO, $0.06 with BALANCED, $0.09 with QUALITY. In credits: 1, 1 and 2 for one image. Four images at QUALITY cost 5 credits, not 8, because roasOS rounds the whole request one time and not each image. Quote the request you mean to send. This is the one reframe lane that returns an image, so its job reports the `image` kind. ## Pricing Unit: image. Pricing key: `ideogram-v3`. | request | credits | |---|---| | `1_image_turbo` | 1 | | `1_image_balanced` | 1 | | `1_image_quality` | 2 | Credits come from the roasOS pricing table (`MODEL_COSTS`) through the catalog. No other field changes the price. ## Modes - `reframe` Provider endpoints: `fal-ai/ideogram/v3/reframe`. ## Request fields | field | type | required | default | rule | |---|---|---|---|---| | `image_size` | enum | yes | — | `square_hd`, `square`, `portrait_4_3`, `portrait_16_9`, `landscape_4_3`, `landscape_16_9`, `736x1312`, `896x1120`, `832x1248`, `864x1152`, `1024x1024`, `1120x896`, `1152x864`, `1248x832`, `1312x736`, `1472x640` | | `image_url` | string | yes | — | https URL; ≤ 4,096 characters | | `num_images` | integer | no | `1` | 1–4 | | `quote_id` | string | no | — | UUID | | `quote_only` | boolean | no | `false` | — | | `rendering_speed` | enum | yes | — | `TURBO`, `BALANCED`, `QUALITY` | | `seed` | integer | no | — | 0–2147483647 | | `wait_timeout_seconds` | integer | no | `0` | 0–60 | | `webhook_url` | string | no | — | https URL; ≤ 4,096 characters | The schema is strict: a field that is not in this table returns `400 unsupported_option`. Field names are the roasOS role names, one name per role across every family. ## Media - `image_url` — first frame (or the single source image) | role | items | max size | content types | duration | |---|---|---|---|---| | `image_url` | ≤ 1 | 10 MB | `image/jpeg`, `image/png`, `image/webp` | — | - Refused: `avatar_id`, `elements`, `product_id`, `product_images`, `references`, `reference_images`, `end_image_url`, `scene_id`, `scene_image`, `video_urls`, `video_url`, `audio_urls`, `audio_url`, `voice_id`. A refused role returns `400 unsupported_option`. - Every URL must be an immutable object on `https://cdn.roasos.com/…` that your workspace owns; any other URL is `400 reference_media_not_workspace_owned`. Upload with `POST /v1/uploads` (direct POST of the bytes to `put_url`, or a `source_url` import), then use the returned CDN URL. ## Prompt None. This model takes no prompt. `rendering_speed` is required and has no default here, although the provider defaults it to BALANCED — in the middle of a threefold price spread. Choose it deliberately. ## Not exposed - `rendering_speed`: pinned to `required, with no default: fal defaults it to BALANCED across a 3x spread`. - `image_urls`: not accepted by this public endpoint. - `style`: not accepted by this public endpoint. - `style_codes`: not accepted by this public endpoint. - `style_preset`: not accepted by this public endpoint. - `color_palette`: not accepted by this public endpoint. - `sync_mode`: not accepted by this public endpoint. - `num_images`: pinned to `fal accepts 1-8; this door admits and delivers 1-4`. ## Result Result kind `image`. Always present: nothing. Present when the run produces it: `avatar_id`, `full_body_url`, `images`, `portrait_url`, `provider_seed`, `reference_sheet`, `url`. ```json { "data": { "id": "gen_…", "kind": "image", "model": "ideogram-v3", "status": "completed", "result": {"avatar_id":"00000000-0000-4000-8000-000000000000","full_body_url":"https://cdn.roasos.com/workspaces/ws_01/full_body_url","images":["https://cdn.roasos.com/workspaces/ws_01/images-1.png"],"portrait_url":"https://cdn.roasos.com/workspaces/ws_01/portrait_url","provider_seed":0,"reference_sheet":"https://cdn.roasos.com/workspaces/ws_01/reference_sheet","url":"https://cdn.roasos.com/workspaces/ws_01/result"} } } ``` Files live on `https://cdn.roasos.com` and are immutable; a result URL can be a media input to the next call. Poll `GET /v1/jobs/{id}/status` → `{ id, status, updated_at }`, then `GET /v1/jobs/{id}/result` (`409 run_not_completed` until the job is `completed`, `failed` or `canceled`). Statuses: `queued → processing → completed | failed | canceled`. ## Example ```bash # 1. quote — nothing is spent curl -X POST https://api.roasos.com/v1/reframe/ideogram-v3 \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-ideogram-v3-0001" \ -H "Content-Type: application/json" \ -d '{"quote_only":true,"image_size":"square_hd","image_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/image_url.png","rendering_speed":"TURBO"}' # → 200 { "data": { "kind": "quote", "quote_id": "q_7Hk…", "credits": 1, "expires_at": "…", "confirmation": { "model": "ideogram-v3", "example": "1_image_turbo" } } } # 2. run — the same body and the same Idempotency-Key, quote_id instead of quote_only curl -X POST https://api.roasos.com/v1/reframe/ideogram-v3 \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-ideogram-v3-0001" \ -H "Content-Type: application/json" \ -d '{"quote_id":"q_7Hk…","image_size":"square_hd","image_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/image_url.png","rendering_speed":"TURBO"}' # → 201 { "data": { "id": "gen_…", "kind": "image", "model": "ideogram-v3", "status": "queued", "credits_reserved": 1, "links": { "status": "/v1/jobs/gen_…/status", "result": "/v1/jobs/gen_…/result" } } } # 3. poll curl https://api.roasos.com/v1/jobs/gen_…/status -H "Authorization: Bearer roasos_sk_live_…" curl https://api.roasos.com/v1/jobs/gen_…/result -H "Authorization: Bearer roasos_sk_live_…" ``` ## Today The endpoint is `POST /v1/reframe/ideogram-v3`. It is not live yet. The route answers `501 model_endpoint_not_implemented`. The live completion-intent validator has no branch for an ideogram reframe, so a completed job could not be recorded after the caller was charged. The lane opens with the migration that admits it, and not before. ## See also https://docs.roasos.com/models/reframe/ideogram-v3 · https://api.roasos.com/v1/catalog/reframe/ideogram-v3 · fal-ai/ideogram/v3/reframe