---
title: "Get the status of several jobs in one call"
method: GET
path: "/api/v1/tts"
tags: ["Public API v1"]
---

# Get the status of several jobs in one call

`GET /api/v1/tts`

## Request

- Base URL: `https://api.vieneu.io`
- URL: `https://api.vieneu.io/api/v1/tts`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Poll up to 50 jobs with ONE request instead of one connection per job. Each entry has exactly the shape of `GET /v1/tts/{jobId}`. Ids that are unknown or not yours are listed in `missing` — a batch is never rejected because of one bad id. Prefer this whenever you have more than one job in flight: it costs the server one database read for the whole batch, and the edge proxy caps concurrent connections per source address.

## Query parameters

- `ids` string, required

## Response `200`

Statuses in request order, plus the ids that could not be resolved.

- PublicTtsBatchStatusResponseDto
  - `jobs` PublicTtsStatusResponseDto[], required: One entry per id that belongs to you, in the order you asked for them. Each has exactly the shape of GET /v1/tts/{jobId}.
    - `jobId` string, required
    - `status` 'queued' | 'processing' | 'completed' | 'failed', required
    - `audioUrl` string: Presigned S3 download URL. Only present when status=completed. Valid for 24 hours.
    - `audioUrlExpiresIn` number: Seconds until audioUrl expires.
    - `duration` number
    - `voiceId` string
    - `textLength` number
    - `createdAt` string, date-time
    - `completedAt` string, date-time
    - `queuePosition` number: Position in queue (only when status=queued).
    - `estimatedWaitSeconds` number: Estimated seconds until processing starts (only when status=queued).
    - `error` string
  - `missing` string[], required: Ids that were not found — unknown, malformed, or belonging to another account (indistinguishable on purpose).

## Other responses

- `400`: `ids` is missing, empty, or lists more than 50 ids.
- `401`: API key missing, malformed, or revoked.
- `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.

## Changes

- **2026-09-16** `98838c7c0e72`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/vieneu/apis/vieneu-api/changes/api/v1/tts/get.md)

---

[API](https://skmtc.dev/vieneu/apis/vieneu-api.md) - [All operations](https://skmtc.dev/vieneu/apis/vieneu-api/llms.txt) - [OpenAPI document](https://skmtc.dev/vieneu/apis/vieneu-api/revisions/9518b716e16d?raw)
