# Voices

`GET /v1/voices` — The roster and your cloned voices — everything speech accepts.

- Base URL: https://eroq.ai/v1
- Auth: `Authorization: Bearer eroq_sk_…` (create keys at https://eroq.ai/dashboard/keys)
- Credits: Free (cloning included) — speech is billed per use

Everything `/v1/audio/speech` accepts as a `voice`: the roster (`kind: "roster"`) and your clones (`kind: "cloned"` — pass the clone's `id`). Characters speak too: use `char:<id>` instead.

**`POST /v1/voices` clones a voice** from audio samples (multipart: `name` + one or more audio `files`, 1GB total) — free, synchronous, returns the clone ready to use. `DELETE /v1/voices/{id}` removes a clone. The paid part is the speech that uses it.

## Example request

```bash
curl https://eroq.ai/v1/voices \
  -H "Authorization: Bearer $EROQ_API_KEY"
```

```javascript
const res = await fetch('https://eroq.ai/v1/voices', {
  headers: { Authorization: `Bearer ${process.env.EROQ_API_KEY}` },
})
console.log(await res.json())
```

```python
import os, requests

res = requests.get("https://eroq.ai/v1/voices", headers={"Authorization": f"Bearer {os.environ['EROQ_API_KEY']}"})
print(res.json())
```

```go
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, _ := http.NewRequest("GET", "https://eroq.ai/v1/voices", nil)
	req.Header.Set("Authorization", "Bearer "+os.Getenv("EROQ_API_KEY"))

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
```

## Response


```json
{
  "voices": [
    { "id": "aria", "name": "Aria", "kind": "roster", "gender": "female" },
    { "id": "b7c2…", "name": "My narrator", "kind": "cloned", "previewUrl": "https://…" }
  ]
}
```
---
Canonical: https://eroq.ai/docs/voices · Index for agents: https://eroq.ai/llms.txt · OpenAPI: https://eroq.ai/openapi.json
