What the documents contain

A meeting produces one output per profile you named at creation. Each is fetched on its own, once its status is completed.

The profiles

keyschema versionwhat it isneeds generation
transcripttranscript.v1verbatim transcript with per-segment timingsno
meeting_summarymarkdown.v1full meeting minutesyes
action_itemsmarkdown.v1decisions and follow-up actionsyes

Name none and you get transcript alone: the cheapest correct answer, and the only one that survives a generation outage, because it needs no model.

GET /output-profiles lists what your organisation may actually name, resolved for your organisation rather than copied from this table. Read it rather than hard-coding, and an unknown key is refused as unknown_output_profile with both the offending keys and the valid ones in the message.

transcript.v1

content is the segment texts joined by blank lines. structured_data is the useful half:

1{
2 "segments": [
3 { "start_ms": 0, "end_ms": 4120, "text": "Da erklærer jeg møtet for satt." },
4 { "start_ms": 4120, "end_ms": 9880, "text": "Første sak er godkjenning av innkalling." }
5 ]
6}

Segments are in timeline order. There are no speaker names: what a transcription model separates out is a voice, not a person, and we do not publish a guess about who it belongs to.

markdown.v1

content is CommonMark. structured_data is null for these two profiles.

The markdown is not plain: sentences grounded in the meeting are wrapped in a <cite> element.

1Styret vedtok <cite data-seg="42">å etablere et samarbeid med nabolaget</cite>.
  • data-seg marks a transcript segment as the evidence
  • data-page marks a page in a document you supplied
  • data-src is optional and says which source it came from

Two things follow, and the first one bites in production.

Render it, and your users see the tags. The wrapped text is ordinary prose that reads correctly without them, so if you do not want provenance in your interface, remove the <cite> elements before rendering. Removing the tags is right; escaping them is not.

1const plain = content.replace(/<\/?cite[^>]*>/g, "")

The numbers do not resolve today. They are our internal segment numbering, and the transcript output does not carry it. Treat a <cite> as a signal that a sentence is grounded, not as a join key into the transcript. If you want to align a passage with audio, use the start_ms/end_ms in transcript.v1 instead.

What a schema version promises

schema_version describes the shape of content and structured_data. It is separate from the profile’s own version, which is pinned onto your meeting at creation.

Publishing a new profile version never changes a meeting that already exists. A meeting created against meeting_summary v1 keeps being produced the way v1 said, even after v2 ships. That is what makes it safe for you to store a document and not re-fetch it.

Branch on schema_version if you parse structured_data. A new shape arrives as a new version, never as a changed one.

Failures are typed

An output that could not be produced reaches status: "failed" and carries a failure_code and a retryable boolean. Branch on those. Log the message, but never parse it: the message is prose we reword, and the code is the contract. See Reliability and recovery.