# Bria | Product Shot Place any product into any scene with a prompt or reference image, keeping product details intact. Built on licensed data for safe, risk-free commercial use and optimized for eCommerce. ## API Information - **Model Slug:** bria-product-shot - **Branded URL:** https://www.eachlabs.ai/bria/bria/bria-product-shot - **Provider:** Bria - **Category:** Image to Image - **Output Type:** image - **Status:** active - **Version:** 0.0.1 - **Base Cost:** Fixed pricing: $0.04 per request - **Estimated Processing Time:** 20 seconds - **Last Updated:** 2026-04-16 - **Interactive Demo:** https://www.eachlabs.ai/ai-models/bria-product-shot ## Pricing - **Charge Type:** dynamic - **Estimated Price (default example):** $0.0400 - **Pricing Details:** Fixed pricing: $0.04 per request ### Pricing Rules | Condition | Pricing | | --- | --- | | Rule 1 | Fixed pricing: $0.04 per request | ## Input Schema | Parameter | Type | Required | Default | Constraints | Description | |-----------|------|----------|---------|-------------|-------------| | image_url | string | Yes | - | - | The URL of the product shot to be placed in a lifestyle shot. If both image_url and image_file are provided, image_url will be used. Accepted formats are jpeg, jpg, png, webp. Maximum file size 12MB. | | scene_description | string | No | - | - | Text description of the new scene or background for the provided product shot. Bria currently supports prompts in English only, excluding special characters. | | ref_image_url | string | No | - | - | The URL of the reference image to be used for generating the new scene or background for the product shot. Use "" to leave empty.Either ref_image_url or scene_description has to be provided but not both. If both ref_image_url and ref_image_file are provided, ref_image_url will be used. Accepted formats are jpeg, jpg, png, webp. | | optimize_description | boolean | No | true | - | Whether to optimize the scene description | | num_results | integer | No | 1 | 1–4 | The number of lifestyle product shots you would like to generate. You will get num_results x 10 results when placement_type=automatic and according to the number of required placements x num_results if placement_type=manual_placement. | | fast | boolean | No | true | - | Whether to use the fast model | | placement_type | string | No | manual_placement | original, automatic, manual_placement, manual_padding | This parameter allows you to control the positioning of the product in the image. Choosing 'original' will preserve the original position of the product in the image. Choosing 'automatic' will generate results with the 10 recommended positions for the product. Choosing 'manual_placement' will allow you to select predefined positions (using the parameter 'manual_placement_selection'). Selecting 'manual_padding' will allow you to control the position and size of the image by defining the desired padding in pixels around the product. | | original_quality | boolean | No | false | - | This flag is only relevant when placement_type=original. If true, the output image retains the original input image's size; otherwise, the image is scaled to 1 megapixel (1MP) while preserving its aspect ratio. | | shot_size | array | No | [1000, 1000] | - | The desired size of the final product shot. For optimal results, the total number of pixels should be around 1,000,000. This parameter is only relevant when placement_type=automatic or placement_type=manual_placement. | | manual_placement_selection | string | No | bottom_center | upper_left,upper_right,bottom_left,bottom_right,right_center,left_center,upper_center,bottom_center,center_vertical,center_horizontal | If you've selected placement_type=manual_placement, you should use this parameter to specify which placements/positions you would like to use from the list. You can select more than one placement in one request. | | padding_values | string | No | - | - | The desired padding in pixels around the product, when using placement_type=manual_padding. The order of the values is [left, right, top, bottom]. For optimal results, the total number of pixels, including padding, should be around 1,000,000. It is recommended to first use the product cutout API, get the cutout and understand the size of the result, and then define the required padding and use the cutout as an input for this API. | ## Example Request ```bash curl -X POST https://api.eachlabs.ai/v1/prediction/ \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "bria-product-shot", "input": { "image_url": "https://storage.googleapis.com/magicpoint/inputs/bria-product-shoot-input.jpg" } }' ``` ## 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 "Authorization: Bearer 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 `Authorization` bearer token | | `404` | Unknown model or prediction id | | `429` | Rate limit — 100 creates / min, 10 concurrent per key | | `5xx` | Retry with backoff | ## Overview **bria-product-shot — Image-to-Image AI Model** Transform product photos into stunning lifestyle scenes effortlessly with **bria-product-shot**, Bria's specialized image-to-image AI model designed for eCommerce visualization. Place any product into custom environments using a simple prompt or reference image, while preserving intricate details like textures, logos, and branding for risk-free commercial use. Built on licensed data, this model from the Bria family eliminates legal risks and delivers production-ready composites optimized for high-volume product catalogs and marketing assets. As part of Bria's Visual AI Editing ecosystem, **bria-product-shot** excels in product shot editing, integrating seamlessly with background removal and generative fill tools to automate workflows for **AI photo editing for e-commerce**. Developers and marketers access it via the **bria-product-shot API** for scalable, precise results without studio shoots. ## Usage Notes - API Base URL: `https://api.eachlabs.ai/v1` - Authentication: send `Authorization: Bearer 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.