---
seo_title: PNG to HEIC API: Convert PNG Images to HEIC | EnConvert
meta_desc: Convert PNG to HEIC with a REST API. POST /v1/convert/png-to-heic accepts multipart .png uploads and returns raw HEIC bytes or a presigned download URL.
keywords: png to heic api, convert png to heic api, png to heic rest api, png to heic python, png to heic node js, heic encoding api, image conversion api heic, png transparency to heic
---

# PNG to HEIC API

The PNG to HEIC API converts a PNG image to HEIC (High Efficiency Image Container) format with a single request to `POST /v1/convert/png-to-heic`. Upload a `.png` file as multipart/form-data and receive raw HEIC bytes back, or set `direct_download=false` to get JSON metadata with a presigned download URL. Because HEIC does not support transparency, transparent areas in the PNG are composited onto a white background.

---

## Endpoint

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

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

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

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

---

## 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 `.heic` 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** with **pillow-heif** for HEIC encoding
- If the PNG has an alpha channel (RGBA), transparent areas are composited onto a **white background**
- Output quality is set to maximum (100)

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

---

## Response

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

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

Returns raw image bytes.

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

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

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

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

### PHP

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

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

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

HEIC does not support transparency, so if the PNG has an alpha channel (RGBA), transparent areas are composited onto a white background in the HEIC output.

### Can I control the HEIC output quality?

No. Output quality is set to maximum (100) and is not configurable. Encoding uses Pillow with pillow-heif.

### Can I get a download URL instead of raw HEIC 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 413 Payload Too Large?

The uploaded file exceeds your plan's maximum file size (5 MB on the Founding plan).
