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

# WebP to PNG API

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

---

## Endpoint

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

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

**Accepted input:** `.webp` files

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

---

## 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 `.webp` image file to convert. |
| `output_filename` | `string` | No | Input filename | Custom output filename. The `.png` 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 WebP has an alpha channel, it is **preserved** in the PNG output
- PNG output uses lossless compression
- Non-RGBA/RGB modes are converted to RGBA


---

## Response

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

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

Returns raw image bytes.

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

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

---

## Code Examples

### Python

```python
import requests

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

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

### Node.js

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

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

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

### PHP

```php
$ch = curl_init("https://api.enconvert.com/v1/convert/webp-to-png");
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.webp")]
]);
$output = curl_exec($ch);
curl_close($ch);
file_put_contents("image_20260405_123456789.png", $output);
```

### Go

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

req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/webp-to-png", 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 `.webp` 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 WebP to PNG with a REST API?

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

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

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

### Is the PNG output lossless?

Yes. The PNG output uses lossless compression, and the conversion is performed by Pillow.

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

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

### Why does the API return 400 Bad Request?

A `400 Bad Request` means the uploaded file is not a `.webp` file, or the conversion failed because the file is corrupt or unsupported.
