---
seo_title: YAML to JSON API for Converting YAML Files to JSON | EnConvert
meta_desc: Convert YAML to JSON with POST /v1/convert/yaml-to-json. Safe parsing, .yaml or .yml input, pretty-printed 2-space JSON output. First document only.
keywords: yaml to json api, convert yaml to json rest api, yaml to json converter api, yml to json api, yaml config to json api, parse yaml to json safely, yaml file to json endpoint, multi document yaml to json
---

# YAML to JSON API

Convert a YAML file to JSON with a single request to `POST /v1/convert/yaml-to-json`. It accepts `.yaml` or `.yml` input, uses safe parsing (no arbitrary code execution), and produces pretty-printed JSON with 2-space indentation. Responses return raw JSON bytes by default, or metadata with a presigned download URL when `direct_download=false`.

---

## Endpoint

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

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

**Accepted input:** `.yaml` or `.yml` files (UTF-8 encoded)

**Output format:** `.json` (`application/json`)

---

## 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 `.yaml` or `.yml` file to convert. Must be UTF-8 encoded. |
| `output_filename` | `string` | No | Input filename | Custom output filename. The `.json` extension is added automatically. |
| `direct_download` | `boolean` | No | `true` | When `true`, returns raw JSON bytes. When `false`, returns metadata with a presigned download URL. |

---

## Conversion Rules

Direct mapping from YAML to JSON:

```yaml
database:
  host: localhost
  port: 5432
features:
- auth
- logging
enabled: true
```

Becomes:

```json
{
  "database": {
    "host": "localhost",
    "port": 5432
  },
  "features": ["auth", "logging"],
  "enabled": true
}
```

- Uses **safe parsing** -- no arbitrary Python object construction from YAML tags
- YAML types are mapped naturally: strings, numbers, booleans, nulls, arrays, objects
- Output is 2-space indented with unicode preserved

<div class="alert alert-info">
<strong>Note:</strong> Only the first YAML document is converted. Multi-document YAML files separated by <code>---</code> will have only the first document processed.
</div>

---

## Response

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

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

### Metadata Response (`direct_download=false`)

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

---

## Code Examples

### Python

```python
import requests

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

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

### Node.js

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

const response = await fetch("https://api.enconvert.com/v1/convert/yaml-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/yaml-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("config.yaml")]
]);
$json = curl_exec($ch);
curl_close($ch);
```

### Go

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

req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/yaml-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)
```

---

## Error Responses

| Status | Condition |
|--------|-----------|
| `400 Bad Request` | File is not a `.yaml` or `.yml` file |
| `400 Bad Request` | Invalid YAML content |
| `400 Bad Request` | YAML to JSON conversion failed |
| `401 Unauthorized` | Missing or invalid API key / JWT token |
| `402 Payment Required` | Monthly ops allowance exhausted |
| `413 Payload Too Large` | File exceeds plan's maximum file size |

---

## Limits

| Limit | Value |
|-------|-------|
| Max file size | Plan-dependent (Founding: 5 MB) |
| Input encoding | UTF-8 only |
| YAML documents | First document only |
| Monthly conversions | Plan-dependent |

## Frequently asked questions

### How do I convert YAML to JSON with a REST API?

Send a `multipart/form-data` POST request to `/v1/convert/yaml-to-json` with your `.yaml` or `.yml` file in the `file` field, authenticated with an `X-API-Key` header or a JWT `Authorization: Bearer` token. The response is pretty-printed JSON with 2-space indentation.

### Is it safe to convert untrusted YAML files to JSON?

The endpoint uses safe parsing, with no arbitrary Python object construction from YAML tags and no arbitrary code execution. YAML types map naturally to JSON strings, numbers, booleans, nulls, arrays, and objects.

### Can I convert multi-document YAML files to JSON?

Only the first YAML document is converted. In files with multiple documents separated by `---`, everything after the first document is not processed.

### Are .yml files accepted as well as .yaml?

Yes. Both `.yaml` and `.yml` extensions are accepted; any other extension returns `400 Bad Request`. Files must be UTF-8 encoded.

### Can I get a presigned download URL instead of raw JSON bytes?

Yes. Set `direct_download=false` to receive metadata with a `presigned_url`, `object_key`, `filename`, `file_size`, and `conversion_time_seconds`.
