---
seo_title: API de HEIC a JPG: Convierte Fotos de iPhone a JPEG | EnConvert
meta_desc: Convierte HEIC a JPG con una API REST. POST /v1/convert/heic-to-jpeg decodifica archivos .heic y .heif y devuelve un JPEG de alta calidad en bytes o URL firmada.
keywords: convertir heic a jpg api, heic a jpeg api, convertir fotos de iphone api, decodificar heic api, heif a jpeg api, convertir heic a jpg python, api conversion heic
---

# API de HEIC a JPG

Convierte imágenes HEIC/HEIF a JPEG mediante programación con `POST /v1/convert/heic-to-jpeg`. El endpoint acepta una carga `.heic` o `.heif`, la decodifica y produce un JPEG de alta calidad. Las respuestas devuelven bytes de imagen sin procesar para descarga directa o metadatos JSON con una URL de descarga firmada.

---

## Endpoint

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

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

**Entrada aceptada:** archivos `.heic or .heif`

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

---

## 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 solicitud

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

---

## Detalles de la conversión

- Usa **pillow-heif** para la decodificación HEIC y **Pillow** para la codificación JPEG
- Si la imagen HEIC tiene un canal alfa, las áreas transparentes se componen sobre un **fondo blanco**
- La calidad de salida está fijada al máximo (100)


---

## Respuesta

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

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

Devuelve bytes de imagen sin procesar.

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

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

---

## Ejemplos de código

### Python

```python
import requests

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

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

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

### PHP

```php
$ch = curl_init("https://api.enconvert.com/v1/convert/heic-to-jpeg");
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.jpeg", $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-jpeg", 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 `.heic or .heif` |
| `400 Bad Request` | La conversión de imagen falló (archivo corrupto o no compatible) |
| `401 Unauthorized` | Clave de API o token JWT faltante o inválido |
| `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 de archivo del 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 HEIC a JPG con una API REST?

Envía una solicitud POST `multipart/form-data` a `/v1/convert/heic-to-jpeg` con tu archivo `.heic` o `.heif` en el campo `file`, autenticada mediante `X-API-Key` o un token JWT `Bearer`. Por defecto, la API responde con los bytes JPEG sin procesar.

### ¿La API acepta tanto archivos .heic como .heif?

Sí. El parámetro `file` acepta archivos `.heic` o `.heif`; cualquier otro tipo devuelve `400 Bad Request`. La decodificación usa pillow-heif y la codificación JPEG usa Pillow.

### ¿Qué ocurre si la imagen HEIC tiene transparencia?

JPEG no admite transparencia, por lo que si la imagen HEIC tiene un canal alfa, las áreas transparentes se componen sobre un fondo blanco en la salida.

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

Sí. Establece `direct_download=false` y la API devuelve metadatos JSON que incluyen `presigned_url`, `object_key`, `filename`, `file_size` y `conversion_time_seconds`.
