---
seo_title: JPEG to WebP API: Optimize Images with WebP | EnConvert
meta_desc: Convert JPEG to WebP with POST /v1/convert/jpeg-to-webp. Get WebP files 25-35% smaller than JPEG at equivalent quality, as raw bytes or a presigned URL.
keywords: jpeg to webp api, jpg to webp api, convert jpeg to webp programmatically, image optimization webp api, webp conversion rest api, reduce image file size api, jpg to webp converter api
---

# JPEG to WebP API

Convert JPEG images to WebP programmatically with `POST /v1/convert/jpeg-to-webp`. The endpoint accepts a `.jpeg` or `.jpg` upload and produces a high-quality WebP with a smaller file size than the equivalent JPEG, making it an easy image optimization step for web delivery pipelines. Responses return either raw image bytes for direct download or JSON metadata with a presigned download URL.

---

## Endpoint

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

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

**Accepted input:** `.jpeg or .jpg` 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 `.jpeg or .jpg` 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
- JPEG's RGB color data is preserved in the WebP output
- Output quality is set to maximum (100)
- WebP typically achieves 25-35% smaller file sizes than JPEG at equivalent visual quality


---

## Response

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

```
HTTP 200 OK
Content-Type: image/webp
Content-Disposition: inline; filename="photo_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}/jpeg-to-webp/photo_20260405_123456789.webp",
    "filename": "photo_20260405_123456789.webp",
    "file_size": 45678,
    "conversion_time_seconds": 0.5
}
```

---

## Code Examples

### Python

```python
import requests

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

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

### Node.js

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

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

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

### PHP

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

### Go

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

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

Send a `multipart/form-data` POST request to `/v1/convert/jpeg-to-webp` with your `.jpeg` or `.jpg` file in the `file` field, authenticated via `X-API-Key` or a `Bearer` JWT token. By default the API responds with the raw WebP bytes.

### How much smaller is WebP than JPEG?

WebP typically achieves 25-35% smaller file sizes than JPEG at equivalent visual quality. This endpoint converts with Pillow at maximum quality (100), preserving the JPEG's RGB color data.

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

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

### Can I set the WebP output quality or filename?

Output quality is fixed at maximum (100) and not configurable. You can set a custom output filename with the `output_filename` parameter; the `.webp` extension is added automatically.
