# Minutes of meetings

> Structured transcription for Arabic meeting recordings. Upload meeting audio and get clean, readable output with duration and word-level timestamps — consistent Arabic meeting records ready for documentation and follow-up actions.

## Endpoint

`POST /api/v1/minutes-of-meeting/transcribe`

Authenticate with your API key in the `x-api-key` header. See [Authentication](/authentication).

| Header | Value |
| --- | --- |
| `x-api-key` | YOUR\_MUNSIT\_API\_KEY |

Upload the recording.

```bash
curl -X POST "https://api.munsit.com/api/v1/minutes-of-meeting/transcribe" \
  -H "x-api-key: $MUNSIT_API_KEY" \
  -F "file=@standup.mp3" \
  -F "model=munsit"
```

```python
import requests, os

r = requests.post(
    "https://api.munsit.com/api/v1/minutes-of-meeting/transcribe",
    headers={"x-api-key": os.environ["MUNSIT_API_KEY"]},
    files={"file": open("standup.mp3", "rb")},
    data={"model": "munsit"},
)
out = r.json()["data"]
print(out["transcriptionId"], out["transcription"])
```

```javascript
import fs from "node:fs";

const form = new FormData();
form.append("file", new Blob([fs.readFileSync("standup.mp3")]), "standup.mp3");
form.append("model", "munsit");

const res = await fetch(
  "https://api.munsit.com/api/v1/minutes-of-meeting/transcribe",
  { method: "POST",
    headers: { "x-api-key": process.env.MUNSIT_API_KEY },
    body: form }
);
const { data } = await res.json();
console.log(data.transcriptionId, data.transcription);
```

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"mime/multipart"
	"net/http"
	"os"
)

func main() {
	var buf bytes.Buffer
	w := multipart.NewWriter(&buf)
	f, _ := os.Open("standup.mp3")
	fw, _ := w.CreateFormFile("file", "standup.mp3")
	io.Copy(fw, f)
	w.WriteField("model", "munsit")
	w.Close()

	req, _ := http.NewRequest("POST",
		"https://api.munsit.com/api/v1/minutes-of-meeting/transcribe", &buf)
	req.Header.Set("x-api-key", os.Getenv("MUNSIT_API_KEY"))
	req.Header.Set("Content-Type", w.FormDataContentType())

	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()

	var out map[string]any
	json.NewDecoder(resp.Body).Decode(&out)
	data := out["data"].(map[string]any)
	fmt.Println(data["transcriptionId"], data["transcription"])
}
```

Response — 200

```
{
  "statusCode": 200,
  "data": {
    "transcriptionId": "805059bf-7c3f-4a1e-9d2b-1f0c6ae83b47",
    "transcription": "لك كلما عمقت الآخرين أصبحت قزما...",
    "duration": 53.661375,
    "timestamps": [
      { "word": "الأشياء", "start": 0.24, "end": 0.31 }
    ]
  },
  "message": "Success"
}
```

## Request

Send the body as `multipart/form-data`. Processing is asynchronous and optimized for pre-recorded meeting audio: upload the recording, Munsit analyzes the content and generates a structured transcript, and you receive organized output with timing for easy review.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `file` | file | **Yes** | Meeting recording audio file — see [supported formats](/speech-to-text/get-started#send). |
| `model` | string | No | ASR model to use: `munsit` (default) or `munsit-en-ar` (mixed Arabic-English with code-switching). |

> 30-minute limit. Minutes of Meetings supports files shorter than 30 minutes. For longer recordings, split the audio into shorter segments for best performance.
> Transcribe-only options. hotwords, language and return_confidence apply to POST /audio/transcribe only.

## Response fields

The payload arrives under `data`, alongside `statusCode` and `message`.

| Field | Type | Description |
| --- | --- | --- |
| `transcriptionId` | string (UUID) | Meeting transcription ID. |
| `transcription` | string | Full transcript. |
| `duration` | number | Audio duration in seconds. |
| `timestamps` | array of objects (`word`, `start`, `end`) | Word-level timing. |
| `originalTranscript` | string | Raw verbatim transcript, before summarisation. |
| `summary` | string | Generated meeting summary. |
| `attributes` | object | Internal metadata blob persisted with the transcription. Prefer the named fields — treat this as unstable. |
| `stats` | object (`fileName`, `fileSize`, `mimeType`, `creditsConsumed`) | Upload metadata and the credits billed for this request. |

## Go further

Downstream analysis and the other shapes of transcription.

- [Keyword extraction →](/understanding/keyword-extraction) — Pull agenda topics and action items out of the meeting. — `POST /keyword-extraction`

- [Diarization →](/speech-to-text/diarization) — Who said what — speaker-labeled meeting segments. — `POST /audio/diarization/transcribe`

- [Transcribe →](/speech-to-text/transcribe) — General-purpose transcription for files under 60 minutes. — `POST /audio/transcribe`

- [Sentiment analysis →](/understanding/sentiment-analysis) — How the meeting felt, not just what was said. — `POST /sentiment-analysis`
