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

# Meeting transcripts

> Push meetings from any tool into a brain

Cortex does not tie you to one meeting tool. Instead it defines a simple **transcript format**, and accepts it from anything that can make an HTTP request: your note-taker's export, a script, a webhook, an automation platform. If a tool can POST a file, it can feed your brain.

## The format

A markdown file with a small header block, then the transcript itself:

```markdown theme={null}
---
kind: transcript
title: "Acme weekly sync"
startedAt: 2026-07-24T10:00:00Z
source: my-notes-tool
externalId: note_12345
attendees:
  - { name: "Jane Doe", email: "jane@acme.com" }
  - { name: "Rob Harlow", email: "rob@example.com" }
actionItems:
  - "Jane to send the revised pricing"
---
[00:00] Jane: ...
[00:41] Rob: ...
```

Two fields matter most:

* **`attendees` with email addresses.** The meeting skill resolves people by email, not by guessing names from the dialogue, so filled-in attendees make the difference between "linked to the right Jane" and "a new page for a second Jane".
* **`externalId`.** A stable id from the source tool. If the same transcript is sent twice, Cortex recognises it and does not create a duplicate.

Everything else is optional. Even a bare transcript with no header works; the filing just has less to go on.

## Where to send it

Any of the normal entry points. The transcript lands in the brain's inbox and is filed like anything else, by your agent, by [auto-ingest](/filing/auto-ingest), or by you in the [review queue](/filing/review-queue).

* **The API**, with a service credential: `POST /api/v1/inbox` (your default brain) or `POST /api/v1/brains/{brain}/inbox` (a named brain). See the [API reference](/reference/api).
* **A webhook source** on the brain: `POST /api/ingest/{brainId}` with the source's secret. See [webhooks](/reference/webhooks).

You can add `?path=meetings` (or any folder) to either URL to suggest where the meeting should file. It is a hint for the filing pass, not an order; the content itself can never choose its own destination.

## Which client is this?

In a [partitioned brain](/brains/partitions) (a clients brain, say), every transcript is matched to a client when it arrives. Add `?partition=acme` to the address if the sender already knows. Otherwise the attendee email domains decide: a call with people from `acme.com` and nobody from another client's domain is Acme's, and your own company's domains never count. A transcript that cannot be placed waits as "needs a client" with its candidates, one click to assign, and the assignment can remember the domain for next time.

Attendees with email addresses are therefore doubly valuable in a partitioned brain: they identify the people and they identify the client.

## A reference pusher for Granola

If your team records calls with Granola, the Cortex repository ships a small script, the Granola collector, that reads each person's notes through the Granola API, writes them in the format above and pushes them in. It routes by attendee: a call with anyone outside your own domains goes to the shared clients brain and Cortex decides the client; a call with only your own people goes to that person's own brain, or nowhere. It runs on your side, on a schedule, with your Granola tokens; Cortex never polls Granola itself.

## Duplicates and retries

Send the same transcript twice, or let a flaky integration retry: as long as `externalId` (or simply the identical content) matches, Cortex returns the existing item instead of creating a copy.
