---
seo_title: PNG to WebP API: Convert PNG Images to WebP | EnConvert
meta_desc: Convert PNG to WebP with a REST API. POST /v1/convert/png-to-webp preserves the alpha channel and returns raw WebP bytes or a presigned URL at quality 100.
keywords: png to webp api, convert png to webp api, png to webp rest api, png to webp with transparency, png to webp python, png to webp node js, image conversion api webp, webp quality 100 api
---

# PNG to WebP API

The PNG to WebP API converts a PNG image to WebP format with a single request to `POST /v1/convert/png-to-webp`. Upload a `.png` file as multipart/form-data and receive raw WebP bytes back, or set `direct_download=false` to get JSON metadata with a presigned download URL. Transparency (alpha channel) is preserved in the WebP output.

---

## Endpoint

```
POST /v1/convert/png-to-webp
```

**Content-Type:** `multipart/form-data`

**Accepted input:** `.png` files

**Output format:** `.webp` (`image/webp`)

---

## Authentication

Requires either a private API key or a JWT token from a public key.

```
X-API-Key: sk_your_private_key
```

Or:

```
Authorization: Bearer <jwt_token>
```

---

## Request Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `file` | file | Yes | -- | The `.png` image file to convert. |
| `output_filename` | `string` | No | Input filename | Custom output filename. The `.webp` extension is added automatically. |
| `direct_download` | `boolean` | No | `true` | When `true`, returns raw image bytes. When `false`, returns JSON metadata with a presigned download URL. |

---

## Conversion Details

- Uses **Pillow** for direct format conversion
- If the PNG has an alpha channel (RGBA), it is **preserved** in the WebP output
- Non-RGBA/RGB modes are converted to RGBA
- Output quality is set to maximum (100)
- WebP supports both lossy and lossless compression; this conversion uses quality 100 for near-lossless output


---

## Response

### Direct Download (`direct_download=true`, default)

```
HTTP 200 OK
Content-Type: image/webp
Content-Disposition: inline; filename="image_20260405_123456789.webp"
```

Returns raw image bytes.

### Metadata Response (`direct_download=false`)

```json
{
    "presigned_url": "https://spaces.example.com/...",
    "object_key": "env/files/{project_id}/png-to-webp/image_20260405_123456789.webp",
    "filename": "image_20260405_123456789.webp",
    "file_size": 45678,
    "conversion_time_seconds": 0.5
}
```

---

## Code Examples

### Python

```python
import requests

with open("image.png", "rb") as f:
    response = requests.post(
        "https://api.enconvert.com/v1/convert/png-to-webp",
        headers={"X-API-Key": "sk_your_private_key"},
        files={"file": ("image.png", f)}
    )

with open("image_20260405_123456789.webp", "wb") as out:
    out.write(response.content)
```

### Node.js

```javascript
const form = new FormData();
form.append("file", fs.createReadStream("image.png"));

const response = await fetch("https://api.enconvert.com/v1/convert/png-to-webp", {
    method: "POST",
    headers: { "X-API-Key": "sk_your_private_key" },
    body: form
});

fs.writeFileSync("image_20260405_123456789.webp", Buffer.from(await response.arrayBuffer()));
```

### PHP

```php
$ch = curl_init("https://api.enconvert.com/v1/convert/png-to-webp");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["X-API-Key: sk_your_private_key"],
    CURLOPT_POSTFIELDS => ["file" => new CURLFile("image.png")]
]);
$output = curl_exec($ch);
curl_close($ch);
file_put_contents("image_20260405_123456789.webp", $output);
```

### Go

```go
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, _ := writer.CreateFormFile("file", "image.png")
file, _ := os.Open("image.png")
io.Copy(part, file)
writer.Close()

req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/png-to-webp", body)
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("X-API-Key", "sk_your_private_key")
resp, _ := http.DefaultClient.Do(req)
```

---

## Error Responses

| Status | Condition |
|--------|-----------|
| `400 Bad Request` | File is not a `.png` file |
| `400 Bad Request` | Image conversion failed (corrupt or unsupported file) |
| `401 Unauthorized` | Missing or invalid API key / JWT token |
| `402 Payment Required` | Monthly ops allowance exhausted |
| `402 Payment Required` | Storage limit reached |
| `413 Payload Too Large` | File exceeds plan's maximum file size |

---

## Limits

| Limit | Value |
|-------|-------|
| Max file size | Plan-dependent (Founding: 5 MB) |
| Output quality | Maximum (not configurable) |
| Monthly conversions | Plan-dependent |

---

## Frequently asked questions

### How do I convert PNG to WebP with a REST API?

Send a `POST` request to `/v1/convert/png-to-webp` with your `.png` file in a `multipart/form-data` body, authenticated via `X-API-Key` or a JWT `Authorization: Bearer` token. The converted WebP is returned as raw image bytes by default.

### Is PNG transparency preserved when converting to WebP?

Yes. If the PNG has an alpha channel (RGBA), it is preserved in the WebP output; non-RGBA/RGB modes are converted to RGBA first.

### Is the WebP output lossy or lossless?

WebP supports both lossy and lossless compression; this conversion uses quality 100 for near-lossless output. The quality setting is not configurable.

### Can I get a download URL instead of raw WebP bytes?

Yes. Set `direct_download=false` and the API returns JSON metadata with a `presigned_url`, `filename`, `file_size`, and `conversion_time_seconds`.

### What is the maximum PNG file size I can upload?

Max file size is plan-dependent (5 MB on the Founding plan). Larger files are rejected with `413 Payload Too Large`.
