# Keyword extraction

> Extract the important terms, entities, and themes from meeting transcripts — key people, organizations, technical terms, topics, and important numbers, grouped and structured. Runs on top of Minutes of Meetings.

## What you get

Keyword extraction intelligently identifies the most important keywords and phrases in your transcribed Arabic content, giving you structured insight into the main themes discussed.

| Insight | Detail |
| --- | --- |
| **Categorized keywords** | Keywords grouped by semantic category — people, organizations, technical terms, topics, numbers. |
| **Speaker keywords** | Speaker-level keyword identification. |
| **Temporal trends** | How keywords rise and fall across the conversation. |
| **Topic analysis** | Topic insights and keyword statistics for deeper understanding. |

Typical use cases: meeting summaries and action-focused reporting; search indexing and content tagging; topic discovery across large audio archives.

## How it works

This endpoint runs on top of a **Minutes of Meetings** transcription — process the meeting first, then extract.

| Step | What happens |
| --- | --- |
| **1 · Generate Minutes of Meeting** | Process the meeting audio with [Minutes of Meetings](/speech-to-text/minutes-of-meetings). |
| **2 · Use the transcription ID** | Send the returned `transcriptionId` to Keyword Extraction. |
| **3 · Choose extraction depth** | Pick `basic`, `standard`, or `comprehensive`. |
| **4 · Review results** | Get structured keywords, topic insights, and trend analysis. |

## Endpoint

`POST /api/v1/minutes-of-meeting/{transcriptionId}/keyword-extraction`

Authenticated with the `x-api-key` header.

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `transcriptionId` | path | string | **Yes** | ID from the Minutes of Meetings transcription. |
| `extraction_depth` | body | string | No | `basic`, `standard`, or `comprehensive`. |

## Extract keywords

Replace `805059bf-7c3f-4a1e-9d2b-1f0c6ae83b47` with the `transcriptionId` from your Minutes of Meetings run.

```bash
curl -X POST "https://api.munsit.com/api/v1/minutes-of-meeting/805059bf-7c3f-4a1e-9d2b-1f0c6ae83b47/keyword-extraction" \
  -H "x-api-key: YOUR_MUNSIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "extraction_depth": "standard" }'
```

```python
import requests

transcription_id = "805059bf-7c3f-4a1e-9d2b-1f0c6ae83b47"  # from the Minutes of Meetings response

response = requests.post(
    f"https://api.munsit.com/api/v1/minutes-of-meeting/{transcription_id}/keyword-extraction",
    headers={"x-api-key": "YOUR_MUNSIT_API_KEY"},
    json={"extraction_depth": "standard"},
)

result = response.json()
print(result["data"]["keywords_by_category"])
```

```javascript
const transcriptionId = "805059bf-7c3f-4a1e-9d2b-1f0c6ae83b47"; // from the Minutes of Meetings response

const response = await fetch(
  `https://api.munsit.com/api/v1/minutes-of-meeting/${transcriptionId}/keyword-extraction`,
  {
    method: 'POST',
    headers: {
      'x-api-key': 'YOUR_MUNSIT_API_KEY',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ extraction_depth: 'standard' }),
  }
);

const result = await response.json();
console.log(result.data.keywords_by_category);
```

```go
package main

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

func main() {
    transcriptionID := "805059bf-7c3f-4a1e-9d2b-1f0c6ae83b47" // from the Minutes of Meetings response
    url := fmt.Sprintf("https://api.munsit.com/api/v1/minutes-of-meeting/%s/keyword-extraction", transcriptionID)
    body, _ := json.Marshal(map[string]string{"extraction_depth": "standard"})

    req, _ := http.NewRequest("POST", url, bytes.NewReader(body))
    req.Header.Set("x-api-key", os.Getenv("MUNSIT_API_KEY"))
    req.Header.Set("Content-Type", "application/json")

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

    var result map[string]any
    json.NewDecoder(resp.Body).Decode(&result)
    fmt.Println(result["data"].(map[string]any)["keywords_by_category"])
}
```

## Response

Structured keywords plus the analysis around them. Extraction depth controls how much detail is populated.

| Field | What it holds |
| --- | --- |
| `keywords_by_category` | Keywords grouped by semantic category. |
| `speaker_keywords` | Keywords attributed to each speaker. |
| `keyword_trends` | Temporal keyword trends across the conversation. |
| `topic_analysis` | Topic insights derived from the keywords. |
| `keyword_statistics` | Statistics for deeper understanding of the content. |
| `language` | Detected language of the transcript. |
| `mixed_languages` | Whether the content mixes languages. |
| `extraction_depth` | The depth level the extraction ran at. |
| `processing_metadata` | Metadata about the processing run. |

## Go further

Keywords pair naturally with the rest of the understanding stack.

- [Minutes of meetings](/speech-to-text/minutes-of-meetings) — Produce the transcriptionId this endpoint needs. — `POST /minutes-of-meeting`

- [Sentiment analysis](/understanding/sentiment-analysis) — Tone, emotions and trends from the same content. — `POST …/sentiment-analysis`

- [Translation](/understanding/translation) — Translate transcripts with streaming output. — `POST /translation/stream`

- [Transcribe audio](/speech-to-text/transcribe) — Plain transcription, when you don't need meeting minutes. — `POST /speech-to-text`
