# Image Converter & Compressor: Bulk WebP, AVIF, Resize — Pixkiln (`cybermax/image-converter`) Actor

Bulk image converter, compressor and resizer: image URLs or a Picpail run in; WebP, AVIF, JPEG or PNG out, resized to fit, EXIF/GPS stripped, in one ZIP with bytes saved per image. Transparent PNG to JPEG on white, animated GIF to animated WebP. $1.50 per 1,000 images; failures free.

- **URL**: https://apify.com/cybermax/image-converter.md
- **Developed by:** [CyberMax](https://apify.com/cybermax) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 image converteds

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

## Pixkiln: Image Converter & Compressor — Bulk WebP, AVIF, JPEG, Resize

#### Turn any list of image URLs into small, web-ready WebP, AVIF, JPEG or PNG files

Give it image URLs (or the result of a [Picpail](https://apify.com/cybermax/bulk-image-downloader) download run); get every image converted, compressed, resized to fit and stripped of EXIF/GPS data, in one ZIP, with the bytes saved per image. **$0.0015 per image converted ($1.50 per 1,000); failed downloads and unreadable files are free.**

**[▶ Try it now with a prefilled input](https://console.apify.com/actors/VsIybOzDCMAneEuDm/input)** · Apify's free plan includes $5 of credit a month, enough for about 3,300 images

**Built for:** store owners moving product photos to WebP (Shopify, WooCommerce, Magento) · SEO and Core Web Vitals work (smaller images = faster pages) · developers who need thumbnails in bulk · AI agents preparing images for other tools · anyone who just downloaded a site's images with Picpail

**Real output** (real Apify run, 10 Nov 2026: 150 images from a Picpail run, converted to WebP at quality 80, no resize):

| Image | From | To | Size before | Size after | Saved |
|---|---|---|---|---|---|
| 2014_Yorkshire_Dales_country_road (7147 px wide) | JPEG | WebP | 18.7 MB | 4.7 MB | 74.7% |
| 20110419_Ani_North_Walls_Turkey_Panorama (13000 px) | JPEG | WebP | 17.5 MB | 3.4 MB | 80.4% |
| 2014_Track_on_Fremington_Edge (4608 px) | JPEG | WebP | 9.2 MB | 2.5 MB | 72.6% |
| book cover thumbnail (100 px) | JPEG | WebP | 11.5 KB | 5.5 KB | 52.5% |
| **All 150 images** | | | **71.1 MB** | **16.8 MB** | **76.4%** |

The same 60 large photos converted to **AVIF with a 1200 px max width** went from 46.9 MB to 0.9 MB (98.2% smaller) in one run.

### What it does

- **Converts** JPEG, PNG, WebP, AVIF, GIF, TIFF and SVG to **WebP, AVIF, JPEG or PNG** (or keeps each image's format and only compresses).
- **Resizes** to a max width and/or height, keeping the aspect ratio; `cover` crops to exact thumbnails, `contain` pads. Small images are never blown up unless you ask.
- **Compresses** with modern encoders (mozjpeg for JPEG, palette PNG, libwebp, AVIF). Quality 80 by default.
- **Strips metadata** (EXIF, GPS location, camera, editing history) after applying the photo's orientation, so nothing comes out sideways.
- **Gets the details right:** transparent PNG to JPEG goes onto white (not black); animated GIF to animated WebP keeps every frame; an already-optimised file is never made bigger (the original bytes are kept).
- **Output:** one ZIP (split into parts past 900 MB), or each image as its own file with a direct link, or both. One row per image with sizes before/after and the % saved.

### How to use it with Picpail (download, then convert)

1. Run [Picpail — Bulk Image Downloader](https://apify.com/cybermax/bulk-image-downloader) on the website, with **Output = "list"** (no files needed).
2. Copy that run's **dataset ID** (Storage tab) into Pixkiln's **"Or: images from an earlier run"** field, pick WebP and a max width, and start.
3. You get one ZIP of web-ready images. Any dataset with an `imageUrl`, `url` or `src` field works the same way.

### Input

| Field | Default | What it does |
|---|---|---|
| `images` | – | Image URLs, one per line. |
| `datasetId` | – | Or: images from an earlier run's dataset (Picpail or any dataset with `imageUrl`/`url`/`src`). |
| `format` | `webp` | `webp`, `avif`, `jpeg`, `png` or `original` (keep each image's format). |
| `quality` | 80 | 1-100. 90+ for portfolios, 60-70 for thumbnails. |
| `maxWidth`, `maxHeight` | – | Shrink to fit, keeping the aspect ratio (e.g. 1600 for web pages, 1200 for product images, 400 for thumbnails). |
| `fit` | `inside` | `inside`, `cover` (crop to the exact box) or `contain` (pad to the exact box). |
| `stripMetadata` | true | Remove EXIF, GPS and camera data. |
| `output` | `zip` | `zip`, `files` (one link per image) or `both`. |
| `neverLarger` | true | Keep the original bytes when a same-format re-encode would be bigger. |
| `maxFileSizeMb` | 25 | Larger source files are skipped (free). |
| `concurrency` | 4 | Images in parallel; lowered automatically to fit the run's memory. |

Example: `{"images": ["https://www.gstatic.com/webp/gallery/1.jpg"], "format": "webp", "quality": 80, "maxWidth": 1600}`

### Output (one row per image)

```json
{
  "sourceUrl": "https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png",
  "status": "converted",
  "fileName": "PNG_transparency_demonstration_1.webp",
  "format": "webp",
  "inputFormat": "png",
  "width": 800, "height": 600, "inputWidth": 800, "inputHeight": 600,
  "inputBytes": 224566,
  "outputBytes": 69056,
  "savedPercent": 69.2,
  "zipFile": "images.zip",
  "zipUrl": "https://api.apify.com/v2/key-value-stores/.../records/images.zip"
}
```

Failed rows have `status: "failed"` and an `error` (HTTP 404, timed out, not a readable image, too large) and are never charged. The run's `OUTPUT` record has the totals and the ZIP links.

### Pricing

**$0.0015 per image converted** (pay per event, no subscription, no start fee). Free: failed downloads, unreadable files, invalid URLs, files over your size limit. 1,000 images = $1.50.

Store image converters on 10 Nov 2026 (free-plan prices from the Apify API): $0.0008-$0.01 per image, median about $0.002; some add $0.01 per run start or charge up to $0.12 for large images. Pixkiln is one flat price per image whatever its size, with no start fee.

### Run it on a schedule

Point it at the same Picpail dataset or image list from an [Apify Schedule](https://docs.apify.com/platform/schedules) (e.g. weekly, after a Picpail run on your catalogue) to keep a WebP copy of every product image current.

### Integrations

- **API:** `POST https://api.apify.com/v2/acts/cybermax~image-converter/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input above as JSON.
- **Python:** `ApifyClient(token).actor("cybermax/image-converter").call(run_input={"images": [...], "format": "webp"})`
- **AI agents (MCP):** available through Apify's MCP server as `cybermax/image-converter`: "convert these images to WebP under 1600 px".
- **Make, Zapier, n8n:** use the Apify app's "Run Actor" step with the JSON input.

### FAQ

**Will WebP work everywhere?** Every current browser shows WebP (and AVIF, except some older Safari versions). Shopify, WooCommerce and WordPress accept WebP uploads.

**Why not a free online converter?** They take 20 files at a time by hand. Pixkiln takes thousands of URLs in one run, works from an API or schedule, and returns a report of what each image saved.

**Does it upscale or change my image?** No upscaling unless you turn it on; only the size you ask for, the format and the compression change. Orientation is applied, colours are kept.

**Is it legal?** Converting images you own or are allowed to use is fine. Pixkiln downloads only the URLs you give it and keeps nothing after your run's storage expires.

### When NOT to use Pixkiln

- You need edits beyond size and format (background removal, watermarks, filters).
- Your images sit behind a login: Pixkiln only downloads public URLs.

### Also from CyberMax

- [Picpail — Bulk Image Downloader](https://apify.com/cybermax/bulk-image-downloader): download every image from a website, then convert them here.
- [Logolark — Company Logo API](https://apify.com/cybermax/logo-finder): logos and icons for a list of domains.
- [Capturewren — Website Screenshot API](https://apify.com/cybermax/website-screenshot): full-page and mobile screenshots.

### Changelog

- 10 Nov 2026: first release. WebP, AVIF, JPEG and PNG output; resize, crop and pad; metadata stripping; Picpail dataset input; ZIP and per-file output.

Found Pixkiln useful? A quick [rating on its Store page](https://apify.com/cybermax/image-converter) helps others find it.

© 2026 CyberMax. All rights reserved.

# Actor input Schema

## `images` (type: `array`):

One image URL per line (JPEG, PNG, WebP, AVIF, GIF, TIFF, SVG). Or leave empty and give a dataset below.

## `datasetId` (type: `string`):

The dataset of a Picpail (Bulk Image Downloader) run in "list" mode, or any dataset with an imageUrl, url or src field. Download all images from a website with Picpail, then convert them here.

## `format` (type: `string`):

WebP is the best all-rounder for websites (25-35% smaller than JPEG). AVIF is smaller still but slower to encode. "Keep format" only resizes and compresses.

## `quality` (type: `integer`):

80 looks the same as the original to most people at a fraction of the size. 90+ for photography portfolios, 60-70 for thumbnails.

## `maxWidth` (type: `integer`):

Shrink anything wider to this width, keeping the aspect ratio. Empty = keep the size. e.g. 1600 for web pages, 1200 for Shopify/WooCommerce product images, 400 for thumbnails.

## `maxHeight` (type: `integer`):

Shrink anything taller to this height. Use with max width to fit a box.

## `fit` (type: `string`):

With both width and height: "inside" keeps the whole image inside the box, "cover" crops to fill it exactly (square thumbnails), "contain" pads to the exact box.

## `stripMetadata` (type: `boolean`):

Removes location, camera and editing data (smaller files, more privacy). Orientation is applied first, so photos never come out sideways.

## `output` (type: `string`):

One ZIP of all images, or each image as its own file with a direct link (good for feeding other tools), or both.

## `neverLarger` (type: `boolean`):

If re-encoding an already optimised image in its own format would make it bigger, keep the original bytes.

## `allowEnlarge` (type: `boolean`):

Off: images smaller than the max size are left at their size.

## `maxFileSizeMb` (type: `integer`):

Bigger source files are skipped (free).

## `maxImages` (type: `integer`):

Stop after this many images (the rest of the list is not downloaded or charged).

## `concurrency` (type: `integer`):

Lowered automatically to fit the run memory (4 at the default 1 GB; give the run 2 GB for 8).

## `timeoutSecs` (type: `integer`):

Give up on one image's download after this long (free).

## Actor input object example

```json
{
  "images": [
    "https://www.gstatic.com/webp/gallery/1.jpg",
    "https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png"
  ],
  "format": "webp",
  "quality": 80,
  "fit": "inside",
  "stripMetadata": true,
  "output": "zip",
  "neverLarger": true,
  "allowEnlarge": false,
  "maxFileSizeMb": 25,
  "maxImages": 10000,
  "concurrency": 4,
  "timeoutSecs": 30
}
```

# Actor output Schema

## `zip` (type: `string`):

No description

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

No description

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

No description

# 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 = {
    "images": [
        "https://www.gstatic.com/webp/gallery/1.jpg",
        "https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cybermax/image-converter").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 = { "images": [
        "https://www.gstatic.com/webp/gallery/1.jpg",
        "https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cybermax/image-converter").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 '{
  "images": [
    "https://www.gstatic.com/webp/gallery/1.jpg",
    "https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png"
  ]
}' |
apify call cybermax/image-converter --silent --output-dataset

```

## MCP server setup

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

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/VsIybOzDCMAneEuDm/builds/uOYoWF3VDCVwWvZjY/openapi.json
