---
seo_title: PNG to SVG API: Embed PNG in an SVG Wrapper | EnConvert
meta_desc: Wrap a PNG inside an SVG via POST /v1/convert/png-to-svg. The PNG is base64-embedded as a data URI in an SVG image element, so you get a wrapper, not vectorization.
keywords: png to svg api, convert png to svg api, embed png in svg, png to svg without vectorization, base64 png data uri svg, png to svg rest api, png inside svg wrapper, raster image in svg
---

# PNG to SVG API

The PNG to SVG API embeds a PNG image inside an SVG wrapper with a single request to `POST /v1/convert/png-to-svg`. The PNG data is base64-encoded and placed as a data URI inside an SVG `<image>` element, with the SVG dimensions and viewBox matching the original image's pixel dimensions. This is not vectorization. The output is a raster image wrapped in SVG. Responses return the SVG bytes directly, or JSON metadata with a presigned download URL when `direct_download=false`.

---

## Endpoint

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

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

**Accepted input:** `.png` 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 `.png` 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 PNG is **base64-encoded and embedded** inside an SVG `<image>` element as a data URI
- The SVG dimensions and viewBox match the original image's pixel dimensions
- Transparency in the PNG is preserved in the embedded data
- **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 raster image inside an SVG container. It does not trace or convert the image to vector paths. The output file will be larger than the input due to base64 encoding (~33% overhead).
</div>

---

## Response

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

```
HTTP 200 OK
Content-Type: image/svg+xml
Content-Disposition: inline; filename="image_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}/png-to-svg/image_20260405_123456789.svg",
    "filename": "image_20260405_123456789.svg",
    "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-svg",
        headers={"X-API-Key": "sk_your_private_key"},
        files={"file": ("image.png", f)}
    )

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

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

### PHP

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

### Does the PNG to SVG API vectorize my image?

No. This endpoint embeds the raster PNG inside an SVG container as a base64 data URI in an SVG `<image>` element. It does not trace or convert the image to vector paths.

### Why is my SVG output file larger than the input PNG?

The PNG is base64-encoded when embedded in the SVG, which adds roughly 33% overhead, so the output file is larger than the input.

### Is PNG transparency preserved when embedding into SVG?

Yes. Transparency in the PNG is preserved in the embedded data, and the SVG dimensions and viewBox match the original image's pixel dimensions.

### How do I convert PNG to SVG with a REST API?

Send a `POST` request to `/v1/convert/png-to-svg` with your `.png` file as `multipart/form-data`, authenticated via `X-API-Key` or a JWT `Authorization: Bearer` token. You get the SVG bytes back, or a `presigned_url` in JSON when `direct_download=false`.

### Why does the API return 400 Bad Request?

A `400 Bad Request` means the uploaded file is not a `.png` file, or the image conversion failed because the file is corrupt or unsupported.
