# PICG — AI Product Photo Scenes (`prixodik/product-image-creative-generator`) Actor

AI scenes for product photos: an AI model builds a styled scene around your product, $0.15 per frame (beta). Or skip AI: cut out the background for $0.01, or place the product on a studio backdrop for $0.02-$0.03. Up to 20 photos per run, pay per published image.

- **URL**: https://apify.com/prixodik/product-image-creative-generator.md
- **Developed by:** [Milchenko Oleksii](https://apify.com/prixodik) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $150.00 / 1,000 ai-generated scenes

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**PICG turns ordinary product photos into ready-to-sell images in batches. Its main feature is the AI scene: an AI image model builds a styled scene around your product, matched to the angle of your photo, for $0.15 per frame (beta).** Prefer no AI? Cut the background out for $0.01, or place the product on a studio backdrop for $0.02-$0.03. Paste a list of photo URLs, press **Start**, and get the results in batches of up to 20 products per run. Built for ecommerce sellers, marketplaces, agencies and catalog teams who need consistent product images without a photo studio.

![AI scene around a perfume bottle — original photo and result](https://iili.io/nwgGsVe.jpg)

You pay per image that is published successfully. Failed images and dry runs produce no per-image charge, and you can cap spending with the run's **Maximum cost per run** setting.

### What can PICG do?

| Mode | What you get | Price per image |
|---|---|---|
| **AI scene** (beta) | An AI image model builds a scene around your product that matches the angle of your photo. 10 styles, retouch level from "almost an exact copy" to "like new". Needs a finite *Maximum cost per run*. | **$0.15** per AI frame |
| **Studio hero** | The product is cut out and placed on a studio background with a soft shadow. 14 studio backgrounds (4 lite, 10 premium) with PhotoCraft; 3 classic scenes without it. | **$0.03** with PhotoCraft · **$0.02** classic |
| **Background removal only** | Just the cut-out product on a transparent PNG, 1600×1600. No text, no scene. | **$0.01** |

All modes share the same batch engine: up to **20 products per run**, 1–5 output files per product, PNG, JPEG or WebP, sizes from 256 to 4096 px (PhotoCraft: 512–2048 px).

#### How the cutout works

The product is cut out **inside the Actor** with the open-source isnet-general-use model (the one used by rembg), followed by a cleanup step that removes stray background fragments. No cloud segmentation service is called. If no product is found or the cutout fails, that image fails instead of being published with a bad result, and it is not charged.

A watermark on the *background* disappears together with the background. A watermark printed on the *product itself* is not removed.

### Examples

Every picture shows the source photo on the left and the PICG result on the right. All examples are real runs.

#### Studio hero with PhotoCraft ($0.03 per image)

14 studio backgrounds. The product is cut out, lit and given a soft shadow.

![Perfume bottle on the champagne-pearl background](https://iili.io/nwgMlbS.jpg)

![Phone on the gloss-black background](https://iili.io/nwgMzxt.jpg)

![Camera lens on the pale-sky background](https://iili.io/nwgM5gf.jpg)

![Sneakers on the infinity-cove background](https://iili.io/nwgM1z7.jpg)

One product on four different backgrounds:

![Bag on four PhotoCraft backgrounds](https://iili.io/nwgMAfs.jpg)

#### Studio hero with the classic renderer ($0.02 per image)

3 ready-made scenes: infinity-cove, gloss-black and concrete-loft.

![Phone in a concrete loft](https://iili.io/nwgMfUv.jpg)

![Sneakers on the gloss-black scene](https://iili.io/nwgMTsn.jpg)

#### Background removal only ($0.01 per image)

A transparent PNG with the product cut out. The checkerboard shows the transparent area. A watermark on the background disappears together with the background.

![Perfume bottle cut out](https://iili.io/nwgMFfa.jpg)

![Bag cut out](https://iili.io/nwgGpRV.jpg)

![Camera lens cut out](https://iili.io/nwgGyOB.jpg)

![Phone cut out](https://iili.io/nwgM9DP.jpg)

#### AI scene, beta ($0.15 per AI frame)

An AI image model builds a scene around your product that follows the angle of your photo. These examples use the styles amber-halo, linen-flatlay, terracotta-arch and navy-gold.

![Perfume bottle in an AI scene](https://iili.io/nwgGsVe.jpg)

![Phone in an AI scene](https://iili.io/nwgGtlj.jpg)

![Bag in an AI scene](https://iili.io/nwgGLiu.jpg)

![Sneakers in an AI scene](https://iili.io/nwgGDUx.jpg)

The three retouch levels, low, medium and high, on one product:

![Watch with three retouch levels](https://iili.io/nwgGix9.jpg)

### More studio results

Left: the source photo. Right: the PICG studio result.

#### Canon AE-1 Program

![Canon AE-1 before and after](https://iili.io/njaJHt2.jpg)

#### Wilson NFL football

![Wilson football before and after](https://iili.io/njaHLGt.jpg)

#### Kodak Brownie

![Kodak Brownie before and after](https://iili.io/njaJ3P9.jpg)

#### Vintage coffee grinder

![Coffee grinder before and after](https://iili.io/njaHp9f.jpg)

#### Leatherman Wave

![Leatherman before and after](https://iili.io/njaJC9j.jpg)

#### Bamboo keyboard

![Bamboo keyboard before and after](https://iili.io/njaJfcu.jpg)

#### Wooden rolling pin

![Rolling pin before and after](https://iili.io/njaHQ6X.jpg)

#### Mortar and pestle

![Mortar before and after](https://iili.io/njaHDas.jpg)

#### VHS tape

![VHS before and after](https://iili.io/njaJ9wl.jpg)

#### Starrett combination square

![Starrett square before and after](https://iili.io/njaH6jp.jpg)

### How to remove a product photo background and make studio images

1. Click **Try for free** (or open the **Input** tab if you are already in Apify Console). The input form is generated from the Actor's input schema, so you do not need to write any JSON.
2. In **1. Your products**, add one entry per product: an `id` and the public HTTPS `imageUrl` of the photo. The form is prefilled with a working demo photo, so you can press **Start** right away to see a result. The demo run produces one image, charged at the price of the chosen mode.
3. In **2. Choose what to make**, pick the **Mode**. *Studio hero* places the product on a studio background; *Background removal only* gives a transparent PNG. Leave **Background removal** on *Cut out the product* and choose a **Studio background**.
4. Optional: switch on **Dry run** first to check the plan without downloading images or creating files.
5. Press **Start**. When the run finishes, open the **Output** tab: it links to the image files, the Dataset journal, `MANIFEST` and `SUMMARY`. You can also fetch everything through the API.

#### Run it from your own code

Every Apify Actor can also be started through the Apify API, scheduled, called from webhooks and connected to integrations (for example Zapier). The same input JSON works in all of them.

**Studio hero** (cut out and place on a studio background):

```json
{
  "schemaVersion": "1.0",
  "preset": "product-photo-hero",
  "backgroundRemoval": "local-cutout",
  "photoCraft": "prefer",
  "photoCraftBackgroundId": "bg-cool-gray",
  "products": [
    { "id": "sku-1", "imageUrl": "https://example.com/product.jpg" }
  ]
}
```

- `photoCraft: "prefer"` uses PhotoCraft and falls back to the classic renderer if it is unavailable. `"require"` fails the image instead of falling back. `"off"` uses the classic renderer.
- `dryRun: true` validates the plan without downloading anything.

**Background removal only** (transparent PNG):

```json
{
  "schemaVersion": "1.0",
  "preset": "background-only",
  "products": [
    { "id": "sku-1", "imageUrl": "https://example.com/product.jpg" }
  ]
}
```

**AI scene** (optional, set a finite *Maximum cost per run*, otherwise the AI scene is unavailable):

```json
{
  "schemaVersion": "1.0",
  "preset": "product-photo-hero",
  "backgroundRemoval": "local-cutout",
  "photoCraft": "prefer",
  "aiScene": { "style": "moss-stone", "placement": "standing", "retouch": "low" },
  "products": [
    { "id": "sku-1", "imageUrl": "https://example.com/product.jpg" }
  ]
}
```

- `style`: moss-stone, beige-silk, amber-halo, mustard-sandstone, lavender-floor, mint-shelf, greige-stone, terracotta-arch, linen-flatlay or navy-gold. The style sets palette, light and materials; the scene itself follows the angle of your photo.
- `placement`: `standing` (default) or `flat` (the product lies flat, top-down view).
- `retouch`: `low` (default, almost an exact copy), `medium` (cleaning and soft colour correction) or `high` ("like new"; small distortions of lettering are possible).
- AI scene is applied to outputs with an aspect ratio between 0.7 and 1.3. A frame that fails the quality check is replaced by a classic PhotoCraft image and charged at the classic price. Check the result against your original photo, especially small print.

### Output

Each run stores:

- the **image files** in the run's key-value store;
- a **Dataset** row per image with its status, size, format and download reference;
- `MANIFEST` and `SUMMARY` records with the result of every product and output, warnings and errors.

Trimmed example of a Dataset row:

```json
{
  "eventType": "output-result",
  "productId": "sku-1",
  "outputId": "hero-square",
  "status": "completed",
  "warnings": [{ "code": "CUTOUT_APPLIED" }],
  "artifact": { "key": "out-sku-1-hero-square-7f200120d08d.png", "bytes": 127687, "mimeType": "image/png" },
  "descriptor": { "template": "product-photo", "format": "png", "width": 1080, "height": 1080 }
}
```

`CUTOUT_APPLIED` is added only after the cutout is confirmed to have a real transparent background.

### Pricing

PICG uses Apify pay-per-event pricing. You pay for what is published, nothing else.

| Event | When it is charged | USD |
|---|---|---|
| `photocraft-basic-creative` | A PhotoCraft studio image is published | **0.03** |
| `creative-generated` | A classic studio image is published | **0.02** |
| `background-removed` | A transparent-PNG cutout (Background removal only) is published | **0.01** |
| `photocraft-ai-scene` | An AI scene frame is published (not charged for rejected frames or the classic fallback) | **0.15** |
| `apify-actor-start` | Platform start of the run | about 0.0001 at 2048 MB |

There is no per-dataset-item fee. Errors, dry-run plans and companion SVG files are not charged per image.

#### How much will it cost to process 100 product photos?

| Batch | Cost |
|---|---|
| 100 photos, background removal only | **$1.00** |
| 100 photos, studio hero, classic renderer | **$2.00** |
| 100 photos, studio hero, PhotoCraft | **$3.00** |
| 10 photos, AI scene | **$1.50** |

Prices are per published image, plus the tiny start event. Set **Maximum cost per run** on any run to cap what you can spend.

### FAQ

#### Which image formats can I upload?

Public HTTPS links to PNG, JPEG or WebP photos. Links to private networks are rejected. Output formats are PNG, JPEG and WebP.

#### How long does a run take?

It depends on the number of photos and the mode. In our own test on Apify, a run with 2 photos and the isnet cutout finished in about 72 seconds, including loading the model. Plan larger batches accordingly and use a dry run to check the plan first.

#### What happens if the product is not found?

The image is not published and not charged. The run reports the reason in `SUMMARY` and `MANIFEST`, and the other products in the batch continue.

#### Can I use the images commercially?

You are responsible for having the rights to the photos you upload and for following the rules of each marketplace where you publish the results.

#### Where are my images stored?

Source photos are downloaded into a sandbox for processing. Results are saved in the run's key-value store; how long they are kept is set by Apify and your plan. The run log does not contain source paths or query strings.

#### Does it fix everything?

No. Glass refraction, hands in the frame, lifestyle scenes and busy assemblies are not guaranteed. The cast shadow is a soft silhouette, not ray-traced lighting. The AI scene can slightly change fine details, so compare the result with your original.

#### Can I run it on a schedule or through the API?

Yes. Like any Apify Actor, PICG supports the Apify API, schedules, webhooks and integrations.

#### Where do I report a problem?

Open an issue on the Actor's **Issues** tab and include the run ID and the `SUMMARY` counters. Automatic refunds are not available; charges are reviewed manually.

### Resources

- Memory: **2048 MB** (fixed)
- Permissions: limited
- Output: image files in the key-value store, Dataset journal, `MANIFEST` and `SUMMARY`

# Actor input Schema

## `products` (type: `array`):

To try it with your own photo, replace the demo <code>imageUrl</code> below with a direct link to your product photo. One object per product. Required: <code>id</code> (letters, digits, <code>\_</code> and <code>-</code>, up to 64 characters) and <code>imageUrl</code> (public HTTPS link to a PNG, JPEG or WebP photo). 1–20 products per run. Optional: <code>sku</code>, <code>category</code>, <code>productKind</code>.

## `preset` (type: `string`):

<strong>Studio hero</strong> (default): the product is cut out and placed on a studio background, 1080×1080. <strong>Background removal only</strong>: just the cut-out product on a transparent PNG, 1600×1600 (needs background removal switched on). The other presets are legacy listing layouts. An explicit <code>outputs</code> list replaces the preset.

## `backgroundRemoval` (type: `string`):

<strong>Cut out the product</strong>: the product is cut out inside the Actor with the isnet-general-use model, no cloud segmentation service is used. If the cutout fails or no product is found, the image fails instead of being published with a bad result. A watermark on the background disappears with it; a watermark printed on the product itself is not removed. <strong>Keep original background</strong>: the photo is used as is.

## `photoCraft` (type: `string`):

PhotoCraft places the cut-out product on a studio background with a soft shadow. <strong>Off</strong>: classic renderer (Sharp). <strong>Prefer</strong>: PhotoCraft, with fallback to the classic renderer if PhotoCraft is unavailable. <strong>Require</strong>: PhotoCraft only; the image fails if it is unavailable.

## `photoCraftBackgroundId` (type: `string`):

Studio background the cut-out product is placed on (4 lite and 10 premium looks). Used when PhotoCraft is not Off.

## `aiScene` (type: `object`):

Leave this field as <code>{}</code> (empty) to run <b>without</b> the AI scene. To turn it on, replace <code>{}</code> with, for example: <code>{"style": "moss-stone"}</code>. Only <code>style</code> is needed; <code>placement</code> (<code>standing</code> or <code>flat</code>) and <code>retouch</code> (<code>low</code>, <code>medium</code>, <code>high</code>) are optional. The AI builds a scene around your product that follows the angle of your photo. You pay for the AI scene only for a frame that is actually published; if a frame fails the quality check, a classic PhotoCraft image is made and charged at the classic price. Set a <em>Maximum cost per run</em> in the run options (for example $0.30 for one product), otherwise the AI scene will not start.

## `sceneId` (type: `string`):

Explicit ScenePack background for the classic renderer (PhotoCraft Off); overrides the automatic choice. An unknown id fails with CAPABILITY_UNAVAILABLE.

## `scenePreset` (type: `string`):

<code>auto</code> (default): the ScenePack is chosen from the product category when <code>sceneId</code> is not set.

## `outputs` (type: `array`):

1–5 outputs per product. If omitted, the preset defines the output.

## `brand` (type: `object`):

Colours as <code>#RRGGBB</code>, font <code>noto-sans</code> and an optional HTTPS <code>logoUrl</code>. Used by the legacy listing templates.

## `dryRun` (type: `boolean`):

Returns the expanded plan in SUMMARY without downloading images or creating files. No per-image charge; the platform cost of starting the run still applies.

## `publishSignedLinks` (type: `boolean`):

Opt-in: add a bearer link (signedUrl) without expiry to the result descriptors; anyone holding it can read the file. Does not change the storage access settings.

## `execution` (type: `object`):

<code>downloadConcurrency</code> 1–4; <code>renderConcurrency</code> supports only 1.

## `schemaVersion` (type: `string`):

Input contract version. Only 1.0 is supported; leave as is.

## Actor input object example

```json
{
  "products": [
    {
      "id": "demo-product",
      "imageUrl": "https://api.apify.com/v2/key-value-stores/49CgWzrjwWhgK20yv/records/06-before.png?signature=IB6h1Wi7FhC7PcdPT7UC",
      "sku": "DEMO-001"
    }
  ],
  "preset": "product-photo-hero",
  "backgroundRemoval": "local-cutout",
  "photoCraft": "prefer",
  "photoCraftBackgroundId": "bg-cool-gray",
  "scenePreset": "auto",
  "dryRun": false,
  "publishSignedLinks": false,
  "schemaVersion": "1.0"
}
```

# Actor output Schema

## `manifest` (type: `string`):

Итог по каждой паре product/output: статус, дескриптор файла, предупреждения и ошибки.

## `summary` (type: `string`):

Счётчики, domain status, причина остановки и remainingRequests для неопубликованных пар.

## `results` (type: `string`):

События output-result; повтор eventId возможен — клиент дедуплицирует или использует MANIFEST.

## `files` (type: `string`):

Все записи запуска, включая out-\* изображения и editable SVG; доступ определяется настройками хранилища.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "products": [
        {
            "id": "demo-product",
            "imageUrl": "https://api.apify.com/v2/key-value-stores/49CgWzrjwWhgK20yv/records/06-before.png?signature=IB6h1Wi7FhC7PcdPT7UC",
            "sku": "DEMO-001"
        }
    ],
    "preset": "product-photo-hero",
    "backgroundRemoval": "local-cutout",
    "photoCraft": "prefer",
    "photoCraftBackgroundId": "bg-cool-gray",
    "schemaVersion": "1.0"
};

// Run the Actor and wait for it to finish
const run = await client.actor("prixodik/product-image-creative-generator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "products": [{
            "id": "demo-product",
            "imageUrl": "https://api.apify.com/v2/key-value-stores/49CgWzrjwWhgK20yv/records/06-before.png?signature=IB6h1Wi7FhC7PcdPT7UC",
            "sku": "DEMO-001",
        }],
    "preset": "product-photo-hero",
    "backgroundRemoval": "local-cutout",
    "photoCraft": "prefer",
    "photoCraftBackgroundId": "bg-cool-gray",
    "schemaVersion": "1.0",
}

# Run the Actor and wait for it to finish
run = client.actor("prixodik/product-image-creative-generator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "products": [
    {
      "id": "demo-product",
      "imageUrl": "https://api.apify.com/v2/key-value-stores/49CgWzrjwWhgK20yv/records/06-before.png?signature=IB6h1Wi7FhC7PcdPT7UC",
      "sku": "DEMO-001"
    }
  ],
  "preset": "product-photo-hero",
  "backgroundRemoval": "local-cutout",
  "photoCraft": "prefer",
  "photoCraftBackgroundId": "bg-cool-gray",
  "schemaVersion": "1.0"
}' |
apify call prixodik/product-image-creative-generator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,prixodik/product-image-creative-generator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/culqqDWkh5L7EWLq8/builds/BJipor7g7RIeZbu2c/openapi.json
