---
title: "Upload a reference audio file"
method: POST
path: "/api/v1/upload"
tags: ["Public API v1"]
---

# Upload a reference audio file

`POST /api/v1/upload`

Upload an audio file (WAV, MP3, OGG, FLAC) to S3 storage. Returns a `fileId` you can use as `refFileId` in voice-clone TTS requests. Max file size: 10 MB. The presigned download URL is valid for 24 hours.

## Response `201`

The stored file. Pass `fileId` as `refFileId` to POST /api/v1/clone.

- PublicUploadResponseDto
  - `fileId` string, required — Unique file identifier (S3 key). Pass this as refFileId in future voice-clone requests.
  - `fileName` string, required
  - `mimeType` string, required
  - `size` number, required — File size in bytes.
  - `url` string, required — Presigned S3 download URL. Valid for 24 hours.
  - `urlExpiresIn` number, required
  - `uploadedAt` string, required

## Other responses

- `400` — No file sent, or an audio type we do not accept.
- `401` — API key missing, malformed, or revoked.
- `413` — File larger than 10 MB.
- `429` — Rate limit or token quota exceeded. When the limit came from the application the response carries `Retry-After` (seconds) and the `X-RateLimit-*` headers and is counted against your API key; a 429 with none of those headers came from the edge proxy and is counted against your source address, shared with every other key calling from it. Back off on either.

---

[API](https://skmtc.dev/vieneu/apis/vieneu-api.md) · [All operations](https://skmtc.dev/vieneu/apis/vieneu-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/vieneu/vieneu-api/revisions/11c8166a6c4d/schema)
