# Luma Dream Machine | Reframe Image The Reframe Image model adjusts an image’s composition to fit different aspect ratios while keeping the main subject centered. It ensures the visual balance and quality remain consistent across formats. ## API Information - **Model Slug:** reframe-image - **Branded URL:** https://www.eachlabs.ai/luma/luma-reframe/reframe-image - **Provider:** Luma - **Category:** Image to Image - **Output Type:** image - **Status:** active - **Version:** 0.0.1 - **Base Cost:** Photon Flash 1 custom pricing - **Estimated Processing Time:** 25 seconds - **Last Updated:** 2026-04-06 - **Interactive Demo:** https://www.eachlabs.ai/ai-models/reframe-image ## Pricing - **Charge Type:** dynamic - **Estimated Price (default example):** $0.0100 - **Pricing Details:** Photon Flash 1 custom pricing ### Pricing Rules | Rule | Condition | Price | | --- | --- | --- | | value_match | model == "photon-flash-1" | $0.0100 | | value_match | model == "photon-1" | $0.0300 | ## Input Schema | Parameter | Type | Required | Default | Constraints | Description | |-----------|------|----------|---------|-------------|-------------| | image | string | Yes | - | - | The image to reframe | | aspect_ratio | string | No | 16:9 | 1:1,3:4,4:3,9:16,16:9,9:21,21:9 | An enumeration. | | prompt | string | No | - | - | A prompt to guide the reframing generation | | model | string | No | photon-flash-1 | photon-flash-1,photon-1 | An enumeration. | | grid_position_x | integer | No | - | - | The x position of the input in the grid, in pixels. Controls horizontal positioning of the source within the target output dimensions. | | grid_position_y | integer | No | - | - | The y position of the input in the grid, in pixels. Controls vertical positioning of the source within the target output dimensions. | | x_start | integer | No | - | - | The x start of the crop bounds, in pixels. Defines the left boundary where your source will be placed in the output frame. The distance between x_start and x_end determines the resized width of your content. | | x_end | integer | No | - | - | The x end of the crop bounds, in pixels. Defines the right boundary where your source will be placed in the output frame. The distance between x_start and x_end determines the resized width of your content. | | y_start | integer | No | - | - | The y start of the crop bounds, in pixels. Defines the top boundary where your source will be placed in the output frame. The distance between y_start and y_end determines the resized height of your content. | | y_end | integer | No | - | - | The y end of the crop bounds, in pixels. Defines the bottom boundary where your source will be placed in the output frame. The distance between y_start and y_end determines the resized height of your content. | | image_url | string | No | - | - | URL of the image to reframe | ## Example Request ```bash curl -X POST https://api.eachlabs.ai/v1/prediction/ \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "reframe-image", "input": { "image": "https://storage.googleapis.com/magicpoint/inputs/luma-reframe-image-input.png" } }' ``` ## Output Schema Response returned by `GET /v1/prediction/{id}` when the job completes: ```json { "status": "success", "predictionID": "string", "output": "string (URL of generated image)", "metrics": { "predict_time": "number (seconds)" } } ``` ## Polling ```bash curl https://api.eachlabs.ai/v1/prediction/{PREDICTION_ID} \ -H "X-API-Key: YOUR_API_KEY" ``` | Status | Meaning | |--------|---------| | `processing` | Still running — poll again | | `success` | Done — read `output` | | `error` | Failed — read `message` / `details` | ## Webhook (alternative to polling) Pass `"webhook_url": "https://your.host/path"` in the create request. Eachlabs POSTs this payload when the job ends: ```json { "exec_id": "prediction-uuid", "status": "succeeded", "output": "https://...", "error": "" } ``` `status` is `"succeeded"` or `"failed"`. `exec_id` equals the `predictionID` from create. Return 2xx within 30 seconds. ## Errors Error body: `{ "status": "error", "message": "...", "details": "..." }` | Code | Meaning | |------|---------| | `400` | Invalid input | | `401` | Missing / invalid `X-API-Key` | | `404` | Unknown model or prediction id | | `429` | Rate limit — 100 creates / min, 10 concurrent per key | | `5xx` | Retry with backoff | ## Overview **reframe-image — Image-to-Image AI Model** Developed by Luma as part of the **luma-reframe** family, **reframe-image** is an **image-to-image AI model** that adjusts an image’s composition to fit different aspect ratios while keeping the main subject centered and preserving visual balance. This solves the common challenge of repurposing visuals for social media, ads, or websites without losing quality or cropping key elements. Ideal for developers seeking an **AI image editor API**, it ensures consistent outputs across formats like portrait to landscape. Luma's **reframe-image** leverages advanced composition controls from the luma-reframe family, enabling seamless adaptation for multi-platform content creation. Users upload an input image and select target aspect ratios, generating reframed versions rapidly. ## Usage Notes - API Base URL: `https://api.eachlabs.ai/v1` - Authentication: send `X-API-Key: YOUR_API_KEY`. Generate a key from the Eachlabs dashboard at https://www.eachlabs.ai/dashboard/api-keys. - File-typed parameters (`*_url`, `image_url`, `video_url`, `audio_url`, etc.) accept publicly-reachable HTTPS URLs only. Upload your asset first (GCS / S3 / your CDN) and pass the resulting URL. Data-URIs and localhost URLs are rejected. - For structured parameters (arrays / objects) send real JSON values, not stringified payloads. - Monetary values are reported in USD; per-token / per-megapixel rates may be billed in micro-cents internally. - Prefer `webhook_url` over polling for long-running predictions — see the Webhook Callback section.