---
seo_title: WebP to HEIC API: Convert WebP Images to HEIC | EnConvert
meta_desc: Convert WebP to HEIC via POST /v1/convert/webp-to-heic. Multipart upload, pillow-heif encoding at quality 100, raw HEIC bytes or a presigned download URL.
keywords: webp to heic api, convert webp to heic, webp to heic converter api, webp to heif api, webp to heic rest api, convert webp to heic programmatically, webp image to heic
---

# WebP to HEIC API

Convert WebP to HEIC with the `POST /v1/convert/webp-to-heic` endpoint, which converts a WebP image to HEIC (High Efficiency Image Container) format at maximum quality. Transparent areas are composited onto a white background, since HEIC does not support transparency. Responses return raw HEIC bytes by default, or JSON metadata with a presigned download URL when `direct_download=false`.

---

## Endpoint

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

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

**Accepted input:** `.webp` 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 `.webp` 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 WebP 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 WebP 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}/webp-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.webp", "rb") as f:
    response = requests.post(
        "https://api.enconvert.com/v1/convert/webp-to-heic",
        headers={"X-API-Key": "sk_your_private_key"},
        files={"file": ("image.webp", 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.webp"));

const response = await fetch("https://api.enconvert.com/v1/convert/webp-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/webp-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.webp")]
]);
$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.webp")
file, _ := os.Open("image.webp")
io.Copy(part, file)
writer.Close()

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

Send a `multipart/form-data` POST request to `/v1/convert/webp-to-heic` with the `.webp` file in the `file` field, authenticated via `X-API-Key` or a Bearer JWT. The response returns raw HEIC bytes by default, or set `direct_download=false` to receive JSON with a presigned download URL.

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

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

### Can I choose the HEIC output quality?

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

### Why does the WebP to HEIC endpoint return a 413 error?

`413 Payload Too Large` is returned when the uploaded file exceeds your plan's maximum file size (5 MB on the Founding plan).
