---
seo_title: API de PNG a WebP: Convierte Imágenes PNG a WebP | EnConvert
meta_desc: Convierte PNG a WebP con una API REST. POST /v1/convert/png-to-webp conserva el canal alfa y devuelve bytes WebP o una URL prefirmada con calidad 100.
keywords: convertir png a webp, api png a webp, png a webp con transparencia, png a webp rest api, png a webp python, png a webp node js, api conversion imagenes webp, webp calidad 100 api
---

# API de PNG a WebP

La API de PNG a WebP convierte una imagen PNG a formato WebP con una sola solicitud a `POST /v1/convert/png-to-webp`. Sube un archivo `.png` como multipart/form-data y recibe los bytes WebP sin procesar, o configura `direct_download=false` para obtener metadatos JSON con una URL de descarga prefirmada. La transparencia (canal alfa) se conserva en la salida WebP.

---

## Endpoint

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

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

**Entrada aceptada:** archivos `.png`

**Formato de salida:** `.webp` (`image/webp`)

---

## Autenticación

Requiere una clave de API privada o un token JWT de una clave pública.

```
X-API-Key: sk_your_private_key
```

O:

```
Authorization: Bearer <jwt_token>
```

---

## Parámetros de la solicitud

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|----------|---------|-------------|
| `file` | file | Sí | -- | El archivo de imagen `.png` a convertir. |
| `output_filename` | `string` | No | Nombre del archivo de entrada | Nombre de archivo de salida personalizado. La extensión `.webp` se añade automáticamente. |
| `direct_download` | `boolean` | No | `true` | Cuando es `true`, devuelve los bytes de la imagen sin procesar. Cuando es `false`, devuelve metadatos JSON con una URL de descarga prefirmada. |

---

## Detalles de la conversión

- Usa **Pillow** para la conversión directa de formato
- Si el PNG tiene un canal alfa (RGBA), se **conserva** en la salida WebP
- Los modos que no son RGBA/RGB se convierten a RGBA
- La calidad de salida se fija al máximo (100)
- WebP admite compresión con pérdida y sin pérdida; esta conversión usa calidad 100 para una salida casi sin pérdida


---

## Respuesta

### Descarga directa (`direct_download=true`, predeterminado)

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

Devuelve los bytes de la imagen sin procesar.

### Respuesta con metadatos (`direct_download=false`)

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

---

## Ejemplos de código

### Python

```python
import requests

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

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

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

### PHP

```php
$ch = curl_init("https://api.enconvert.com/v1/convert/png-to-webp");
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.webp", $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-webp", body)
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("X-API-Key", "sk_your_private_key")
resp, _ := http.DefaultClient.Do(req)
```

---

## Respuestas de error

| Estado | Condición |
|--------|-----------|
| `400 Bad Request` | El archivo no es un archivo `.png` |
| `400 Bad Request` | La conversión de la imagen falló (archivo corrupto o no compatible) |
| `401 Unauthorized` | Falta la clave de API/token JWT o no es válida |
| `402 Payment Required` | Se agotó la cuota mensual de ops |
| `402 Payment Required` | Se alcanzó el límite de almacenamiento |
| `413 Payload Too Large` | El archivo supera el tamaño máximo permitido por tu plan |

---

## Límites

| Límite | Valor |
|-------|-------|
| Tamaño máximo de archivo | Según el plan (Founding: 5 MB) |
| Calidad de salida | Máxima (no configurable) |
| Conversiones mensuales | Según el plan |

---

## Preguntas frecuentes

### ¿Cómo convierto PNG a WebP con una API REST?

Envía una solicitud `POST` a `/v1/convert/png-to-webp` con tu archivo `.png` en un cuerpo `multipart/form-data`, autenticada mediante `X-API-Key` o un token JWT `Authorization: Bearer`. El WebP convertido se devuelve como bytes de imagen sin procesar de forma predeterminada.

### ¿Se conserva la transparencia del PNG al convertir a WebP?

Sí. Si el PNG tiene un canal alfa (RGBA), se conserva en la salida WebP; los modos que no son RGBA/RGB se convierten primero a RGBA.

### ¿La salida WebP es con pérdida o sin pérdida?

WebP admite compresión con pérdida y sin pérdida; esta conversión usa calidad 100 para una salida casi sin pérdida. El ajuste de calidad no es configurable.

### ¿Puedo obtener una URL de descarga en lugar de los bytes WebP sin procesar?

Sí. Configura `direct_download=false` y la API devuelve metadatos JSON con `presigned_url`, `filename`, `file_size` y `conversion_time_seconds`.

### ¿Cuál es el tamaño máximo de archivo PNG que puedo subir?

El tamaño máximo de archivo depende del plan (5 MB en el plan Founding). Los archivos más grandes se rechazan con `413 Payload Too Large`.
