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

# Turn a meeting recording into memory

> Drop in the audio. It comes back as transcribed, searchable memory nobody had to write up.

[← All use cases](https://docs.memory.anonalabs.com/use-cases/overview.md)

[document\_qa.py](https://github.com/anonalabs/Anona-Memory-SDK/blob/main/examples/document_qa.py)[background\_ingestion.py](https://github.com/anonalabs/Anona-Memory-SDK/blob/main/examples/background_ingestion.py)

## The scenario

The decision was made on a call. Nobody wrote it down, or somebody wrote down
half of it, and three weeks later the team is relitigating a thing that was
already settled.

The recording exists. It is just not *answerable* — nobody is going to scrub
forty minutes of audio to check who agreed to what.

## Step 1 — Upload the audio

Audio is a file like any other. `upload_file` takes MP3 and WAV, transcribes
them, and stores the result as ordinary memory in the same space as everything
you have recorded by hand.

```python theme={null}
job = client.upload_file(
    space_id="team-meetings",
    file="standup-2026-09-14.mp3",
    tags=["meeting", "platform-team"],
)
```

Ingestion is asynchronous, so this returns `{"job_ids": [...]}` rather than
waiting. Tag it on the way in — that is what lets you later ask about one
team's meetings and not everyone's.

## Step 2 — Wait for it, or be told

```python theme={null}
while True:
    status = client.get_job(space_id="team-meetings", job_id=job["job_ids"][0])
    if status["status"] in ("completed", "failed"):
        break
    time.sleep(5)
```

For anything beyond a script, register a webhook instead of polling — see
[Know the moment ingestion finishes](https://github.com/anonalabs/Anona-Memory-SDK/blob/main/examples/webhooks_and_settings.py).

## Step 3 — Ask the meeting a question

```python theme={null}
print(client.reason(
    space_id="team-meetings",
    query="What did we decide about the pricing change, and who raised concerns?",
))
```

The transcript is memory now, so it composes with everything else: a question
can draw on the call, the design doc you uploaded, and the notes somebody typed.

## Evals

1. Upload one recording where you know the answer to a specific question.
2. Ask that question. Check the answer names the right person.
3. Ask something the recording does **not** cover. A useful system says it does
   not know; if it invents an answer, your `min_score` floor is too low — see
   [Tuning Recall Quality](https://docs.memory.anonalabs.com/guides/tuning-recall.md).
4. Upload a second recording from a different team with different tags, and
   confirm a tagged query does not cross over.

## Guardrails

> [!WARNING]
>
> **Record people knowingly.** A meeting recording is personal data about
> everyone on the call, and it becomes searchable by everyone with access to
> the space. Get consent, and scope the space so it reaches only who it should.
> If someone later asks to be removed, [that is a runbook](https://docs.memory.anonalabs.com/use-cases/delete-a-users-memories.md),
> not an afternoon of grep.

* **Per-file limits apply**: 25 MB for audio, 64 MB for video. A long call may
  need splitting.
* **A transcript is not a verbatim record.** It is good enough to answer
  questions and to point you at the moment; it is not evidence. Keep the
  original file if the exact words matter.
* **Tag on upload, not afterwards.** There is no bulk retag, so an untagged
  corpus stays untagged.

## Built from

Every call above appears in one of these two runnable scripts:
[`document_qa.py`](https://github.com/anonalabs/Anona-Memory-SDK/blob/main/examples/document_qa.py),
[`background_ingestion.py`](https://github.com/anonalabs/Anona-Memory-SDK/blob/main/examples/background_ingestion.py).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.