---
seo_title: HEIC to SVG API: Wrap HEIC Images in SVG | EnConvert
meta_desc: Convert HEIC to SVG via POST /v1/convert/heic-to-svg. Decodes HEIC to PNG and embeds it in an SVG wrapper without vectorizing. Raw bytes or presigned URL.
keywords: heic to svg api, convert heic to svg, heic to svg converter api, heif to svg api, embed heic in svg, heic to svg rest api, convert heic to svg programmatically
---

# HEIC to SVG API

Convert HEIC to SVG with the `POST /v1/convert/heic-to-svg` endpoint, which embeds a HEIC/HEIF image inside an SVG wrapper. The HEIC is first decoded to PNG, then base64-encoded and placed as a data URI inside an SVG `<image>` element. This is not vectorization. Responses return the raw SVG bytes by default, or JSON metadata with a presigned download URL when `direct_download=false`.

---

## Endpoint

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

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

**Accepted input:** `.heic or .heif` files

**Output format:** `.svg` (`image/svg+xml`)

---

## 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 `.heic or .heif` image file to convert. |
| `output_filename` | `string` | No | Input filename | Custom output filename. The `.svg` 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

- The HEIC is first decoded to PNG using **pillow-heif**, then **base64-encoded and embedded** inside an SVG `<image>` element
- The SVG dimensions and viewBox match the original image's pixel dimensions
- **This is NOT vectorization** -- the output contains the full raster image data, not vector paths

<div class="alert alert-warning">
<strong>Not vectorization:</strong> This endpoint embeds the decoded raster image inside an SVG container. It does not trace or convert the image to vector paths.
</div>

---

## Response

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

```
HTTP 200 OK
Content-Type: image/svg+xml
Content-Disposition: inline; filename="photo_20260405_123456789.svg"
```

Returns raw image bytes.

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

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

---

## Code Examples

### Python

```python
import requests

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

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

### Node.js

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

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

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

### PHP

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

### Go

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

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

Send a `multipart/form-data` POST request to `/v1/convert/heic-to-svg` with the `.heic` or `.heif` file in the `file` field, authenticated via `X-API-Key` or a Bearer JWT. You get the SVG bytes back directly, or set `direct_download=false` for JSON with a presigned download URL.

### Does HEIC to SVG conversion vectorize the image?

No. The endpoint decodes the HEIC to PNG with pillow-heif, then base64-encodes it as a data URI inside an SVG `<image>` element. The output contains the full raster image data, not traced vector paths.

### What dimensions does the output SVG have?

The SVG dimensions and viewBox match the original HEIC image's pixel dimensions.

### Why does the HEIC to SVG endpoint return a 400 error?

`400 Bad Request` is returned when the uploaded file is not a `.heic` or `.heif` file, or when the conversion fails because the file is corrupt or unsupported.
