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

# Word timestamps

> Get exact per-word start and end times with your synchronous transcript.

The `timestamps` field controls whether each word in the response carries `start` and `end` times (in milliseconds, relative to the start of the audio).

* Value: a boolean, default `false`
* `false` (default): no timestamps are computed, and `start`/`end` are omitted from the `words` objects — there is no extra processing cost
* `true`: exact timings are computed for each word, at an additional latency cost

<Note>
  Timings are exact or absent, never approximate: any word that can't be aligned has `start`/`end` omitted rather than estimated. Timestamp accuracy is best for English audio.
</Note>

<Tabs>
  <Tab title="Python" language="python">
    ```python theme={null}
    import json
    import requests

    with open("sample.wav", "rb") as f:
        audio = f.read()

    config = {"timestamps": True}

    response = requests.post(
        "https://sync.assemblyai.com/transcribe",
        headers={
            "Authorization": "<YOUR_API_KEY>",
            "X-AAI-Model": "universal-3-5-pro",
        },
        files={
            "audio": ("sample.wav", audio, "audio/wav"),
            "config": (None, json.dumps(config), "application/json"),
        },
        timeout=60,
    )
    response.raise_for_status()
    for word in response.json()["words"]:
        print(f'{word["start"]:>6} - {word["end"]:>6}  {word["text"]}')
    ```
  </Tab>

  <Tab title="JavaScript" language="javascript">
    ```javascript theme={null}
    import { readFileSync } from "fs";

    const audio = readFileSync("sample.wav");
    const config = { timestamps: true };

    const form = new FormData();
    form.append("audio", new Blob([audio], { type: "audio/wav" }), "sample.wav");
    form.append(
      "config",
      new Blob([JSON.stringify(config)], { type: "application/json" })
    );

    const response = await fetch("https://sync.assemblyai.com/transcribe", {
      method: "POST",
      headers: {
        Authorization: "<YOUR_API_KEY>",
        "X-AAI-Model": "universal-3-5-pro",
      },
      body: form,
    });

    const result = await response.json();
    for (const word of result.words) {
      console.log(`${word.start} - ${word.end}  ${word.text}`);
    }
    ```
  </Tab>

  <Tab title="cURL" language="bash">
    ```bash theme={null}
    curl -X POST https://sync.assemblyai.com/transcribe \
      -H 'Authorization: <YOUR_API_KEY>' \
      -H 'X-AAI-Model: universal-3-5-pro' \
      -F 'audio=@sample.wav;type=audio/wav' \
      -F 'config={"timestamps":true};type=application/json'
    ```
  </Tab>
</Tabs>

With `timestamps` enabled, each entry in `words` includes its timing:

```json theme={null}
{
  "text": "Hi, I'm calling about my Best Buy order...",
  "words": [
    { "text": "Hi",  "start": 0,   "end": 200, "confidence": 0.91 },
    { "text": "I'm", "start": 220, "end": 320, "confidence": 0.88 }
  ],
  "confidence": 0.87,
  "audio_duration_ms": 101567,
  "session_id": "eb92c4ff-4bbb-429f-9b99-7279d7fe738f"
}
```

## Combining with other features

`timestamps` composes with the other `config` fields — [prompting and keyterms](/sync-stt/prompting-and-keyterms), [conversation context](/sync-stt/conversation-context), and [language selection](/sync-stt/language-selection) — in the same request.
