---
seo_title: API CSV a JSON | Convertir archivos CSV a JSON | EnConvert
meta_desc: Convierte CSV a JSON con POST /v1/convert/csv-to-json. La primera fila define las claves y cada fila es un objeto JSON; los valores quedan como strings.
keywords: csv a json api, convertir csv a json api, api rest csv a json, csv a array json, filas csv a objetos json, parsear csv a json api, subir csv convertir a json, endpoint csv a json
---

# API de CSV a JSON

Convierte un archivo CSV a un array JSON con una sola petición a `POST /v1/convert/csv-to-json`. La primera fila se usa como cabeceras de columna y cada fila siguiente se convierte en un objeto JSON dentro del array de salida, con todos los valores conservados como strings (sin inferencia de tipos). Las respuestas devuelven los bytes JSON sin procesar por defecto, o metadatos con una URL de descarga prefirmada cuando `direct_download=false`.

---

## Endpoint

```
POST /v1/convert/csv-to-json
```

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

**Entrada aceptada:** archivos `.csv` (codificados en UTF-8)

**Formato de salida:** `.json` (`application/json`)

---

## Autenticación

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

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

O bien:

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

---

## Parámetros de la petición

| Parámetro | Tipo | Obligatorio | Por defecto | Descripción |
|-----------|------|----------|---------|-------------|
| `file` | file | Sí | -- | El archivo `.csv` a convertir. La primera fila debe contener las cabeceras de columna. Codificado en UTF-8. |
| `output_filename` | `string` | No | Nombre del archivo de entrada | Nombre de archivo de salida personalizado. La extensión `.json` se añade automáticamente. |
| `direct_download` | `boolean` | No | `true` | Con `true`, devuelve los bytes JSON sin procesar. Con `false`, devuelve metadatos con una URL de descarga prefirmada. |

---

## Reglas de conversión

```csv
name,age,city
Alice,30,London
Bob,25,Paris
```

Se convierte en:

```json
[
  {"name": "Alice", "age": "30", "city": "London"},
  {"name": "Bob", "age": "25", "city": "Paris"}
]
```

- La primera fila se trata como cabeceras de columna
- El delimitador es la coma (no configurable)
- **Todos los valores permanecen como strings** en la salida JSON -- no se realiza inferencia de tipos. El número `30` en el CSV se convierte en `"30"` en el JSON, no en `30`.
- La salida es JSON con formato legible e indentación de 2 espacios

---

## Respuesta

### Descarga directa (`direct_download=true`, por defecto)

```
HTTP 200 OK
Content-Type: application/json
Content-Disposition: inline; filename="data_20260405_123456789.json"
```

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

```json
{
    "presigned_url": "https://spaces.example.com/...",
    "object_key": "env/files/{project_id}/csv-to-json/data_20260405_123456789.json",
    "filename": "data_20260405_123456789.json",
    "file_size": 1234,
    "conversion_time_seconds": 0.03
}
```

---

## Ejemplos de código

### Python

```python
import requests

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

with open("data.json", "wb") as out:
    out.write(response.content)
```

### Node.js

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

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

const json = await response.json();
```

### PHP

```php
$ch = curl_init("https://api.enconvert.com/v1/convert/csv-to-json");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["X-API-Key: sk_your_private_key"],
    CURLOPT_POSTFIELDS => ["file" => new CURLFile("data.csv", "text/csv")]
]);
$json = curl_exec($ch);
curl_close($ch);
```

### Go

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

req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/csv-to-json", 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 `.csv` |
| `400 Bad Request` | El archivo CSV está vacío o no tiene filas válidas |
| `400 Bad Request` | Codificación CSV no válida (se espera UTF-8) |
| `401 Unauthorized` | Clave API o token JWT ausente o no válido |
| `402 Payment Required` | Cuota mensual de ops agotada |
| `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) |
| Codificación de entrada | Solo UTF-8 |
| Inferencia de tipos | Ninguna (todos los valores son strings) |
| Conversiones mensuales | Según el plan |

## Preguntas frecuentes

### ¿Cómo convierto CSV a JSON con una API REST?

Envía una petición POST `multipart/form-data` a `/v1/convert/csv-to-json` con tu archivo `.csv` en el campo `file`, autenticada con una cabecera `X-API-Key` o un token JWT `Authorization: Bearer`. La primera fila debe contener las cabeceras de columna.

### ¿Por qué los números de mi CSV se devuelven como strings en el JSON?

No se realiza inferencia de tipos. Todos los valores permanecen como strings en la salida JSON. El número `30` en el CSV se convierte en `"30"` en el JSON, no en `30`.

### ¿Puedo usar un delimitador distinto de la coma?

No. El delimitador es siempre la coma y no es configurable.

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

Sí. Establece `direct_download=false` para recibir metadatos con `presigned_url`, `object_key`, `filename`, `file_size` y `conversion_time_seconds`.

### ¿Por qué la API de CSV a JSON devuelve 400 Bad Request?

Se devuelve un `400` cuando el archivo no es un archivo `.csv`, el CSV está vacío o no tiene filas válidas, o la codificación no es UTF-8. Los archivos demasiado grandes devuelven `413 Payload Too Large`.
