---
seo_title: PNG to JPEG API: Convert PNG to JPG in Code | EnConvert
meta_desc: Convert PNG to JPEG via REST API. POST /v1/convert/png-to-jpeg composites transparency onto a white background and returns raw bytes or a presigned URL.
keywords: png to jpeg api, png to jpg api, convert png to jpeg programmatically, png to jpg converter api, png transparency to jpeg, convert png to jpg python, image conversion rest api
---

# PNG to JPEG API

Convert PNG images to JPEG programmatically with `POST /v1/convert/png-to-jpeg`. The endpoint accepts a `.png` upload and, because JPEG does not support transparency, composites any transparent areas onto a white background. Responses return either raw image bytes for direct download or JSON metadata with a presigned download URL.

---

## Endpoint

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

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

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

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

---

## 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 `.jpeg` 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), transparent areas are composited onto a **white background** before conversion
- Other non-RGB color modes are converted to RGB
- Output quality is set to maximum (100)

<div class="alert alert-info">
<strong>Transparency note:</strong> JPEG does not support transparency. Any transparent or semi-transparent areas in your PNG will appear white in the JPEG output.
</div>

---

## Response

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

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

Returns raw image bytes.

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

```json
{
    "presigned_url": "https://spaces.example.com/...",
    "object_key": "env/files/{project_id}/png-to-jpeg/image_20260405_123456789.jpeg",
    "filename": "image_20260405_123456789.jpeg",
    "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-jpeg",
        headers={"X-API-Key": "sk_your_private_key"},
        files={"file": ("image.png", f)}
    )

with open("image_20260405_123456789.jpeg", "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-jpeg", {
    method: "POST",
    headers: { "X-API-Key": "sk_your_private_key" },
    body: form
});

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

### PHP

```php
$ch = curl_init("https://api.enconvert.com/v1/convert/png-to-jpeg");
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.jpeg", $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-jpeg", 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 a PNG to JPG with a REST API?

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

### What happens to PNG transparency when converting to JPEG?

JPEG does not support transparency, so any transparent or semi-transparent areas in the PNG (RGBA alpha channel) are composited onto a white background and will appear white in the JPEG output.

### 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 control the JPEG output quality?

No. Output quality is fixed at maximum (100) and is not configurable. You can customize the output filename with the `output_filename` parameter; the `.jpeg` extension is added automatically.
