> ## Documentation Index
> Fetch the complete documentation index at: https://docs.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](/use-cases/overview)

<div className="uc-examples"><a href="https://github.com/anonalabs/Anona-Memory-SDK/blob/main/examples/document_qa.py">document\_qa.py</a><a href="https://github.com/anonalabs/Anona-Memory-SDK/blob/main/examples/background_ingestion.py">background\_ingestion.py</a></div>

## 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](/guides/tuning-recall).
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](/use-cases/delete-a-users-memories),
  not an afternoon of grep.
</Warning>

* **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).
