> ## Documentation Index
> Fetch the complete documentation index at: https://docs.destined.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Batch Jobs

> Track and manage asynchronous batch processing

## Overview

Batch jobs allow you to process multiple TTS synthesis requests asynchronously. This is ideal for bulk audio generation, podcast production, or dataset creation.

## Creating a Batch Job

```typescript theme={null}
const job = await client.ttsGeneration.batchSynthesizeV1TtsBatchPost({
  items: [
    { speakerId: "speaker-1", text: "First sentence." },
    { speakerId: "speaker-2", text: "Second sentence." },
    { speakerId: "speaker-3", text: "Third sentence." },
  ],
});

console.log(job.jobId);
// "job_abc123xyz"
```

## Job Status

Track job progress:

```typescript theme={null}
const status = await client.jobs.getJobV1JobsJobIdGet({
  jobId: "job_abc123xyz",
});

console.log(status);
// {
//   job_id: "job_abc123xyz",
//   status: "processing",
//   progress: 67,
//   total_items: 3,
//   completed_items: 2,
//   created_at: "2024-01-15T10:30:00Z",
//   updated_at: "2024-01-15T10:31:00Z"
// }
```

## Job States

| Status       | Description                         |
| ------------ | ----------------------------------- |
| `pending`    | Job created, waiting to start       |
| `processing` | Currently generating audio          |
| `completed`  | All items processed successfully    |
| `failed`     | Job failed (check error details)    |
| `partial`    | Some items failed, others succeeded |

## Retrieving Results

When a job completes:

```typescript theme={null}
const results = await client.jobs.getJobV1JobsJobIdGet({
  jobId: "job_abc123xyz",
});

if (results.status === "completed") {
  for (const item of results.results) {
    console.log(`Speaker: ${item.speakerId}`);
    console.log(`Audio: ${item.audioUrl}`);
  }
}
```

## Listing Jobs

View all your jobs:

```typescript theme={null}
const jobs = await client.jobs.listJobsV1JobsGet({
  status: "completed",  // Filter by status
  limit: 20,
  offset: 0,
});

for (const job of jobs.items) {
  console.log(`${job.job_id}: ${job.status} (${job.progress}%)`);
}
```

## WebSocket Updates

For real-time progress updates, connect via WebSocket:

```typescript theme={null}
const ws = new WebSocket(`wss://api.destined.ai/ws/jobs/${jobId}`);

ws.onmessage = (event) => {
  const update = JSON.parse(event.data);
  console.log(`Progress: ${update.progress}%`);

  if (update.status === "completed") {
    console.log("Job complete!", update.results);
    ws.close();
  }
};
```

## Best Practices

<AccordionGroup>
  <Accordion title="Use batch for 3+ items">
    For 1-2 items, use direct synthesis. For 3+ items, batch is more efficient.
  </Accordion>

  <Accordion title="Implement polling or WebSocket">
    Don't block on job completion. Use polling with exponential backoff or WebSocket for updates.
  </Accordion>

  <Accordion title="Handle partial failures">
    Check individual item results even when job shows "completed". Some items may have failed.
  </Accordion>

  <Accordion title="Set reasonable batch sizes">
    Keep batches under 100 items for faster processing. Split larger jobs into multiple batches.
  </Accordion>
</AccordionGroup>
