png-to-svg
Embed a PNG image inside an SVG wrapper. The PNG data is base64-encoded and placed as a data URI inside an SVG <image> element. This is not vectorization -- the output is a raster image wrapped in SVG.
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_live_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
Not vectorization: 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).
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)
{
"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
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_live_your_private_key"},
files={"file": ("image.png", f)}
)
with open("image_20260405_123456789.svg", "wb") as out:
out.write(response.content)
Node.js
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_live_your_private_key" },
body: form
});
fs.writeFileSync("image_20260405_123456789.svg", Buffer.from(await response.arrayBuffer()));
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_live_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
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_live_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 conversion limit reached |
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 (Free: 5 MB) |
| Output quality | Maximum (not configurable) |
| Monthly conversions | Plan-dependent |