Export transcription
GET /transcriptions/{id}/export — download one transcription as a ready-to-save Markdown or text file.
GET /transcriptions/{id}/export
Returns a downloadable file (not JSON). Markdown includes YAML frontmatter so it drops straight into Obsidian or any notes app.
Path parameters
| Parameter | Type | Description |
|---|---|---|
id | UUID | Transcription identifier. |
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
format | string | md | md (Markdown + frontmatter), txt (plain text) or json (the full record, segments included). Any other value → 422. |
Response
200 OK with a file body. The filename comes from the meeting title via Content-Disposition:
| Format | Content-Type | Contents |
|---|---|---|
md | text/markdown; charset=utf-8 | YAML frontmatter + transcript + AI reports. UTF-8 with BOM |
txt | text/plain; charset=utf-8 | Plain transcript text. UTF-8 with BOM |
json | application/json; charset=utf-8 | Exactly the body of Get transcription. UTF-8, no BOM |
Encoding
Everything is UTF-8. txt and md start with a byte-order mark so Notepad and older tools
pick the encoding up on their own. If you script the download in Windows PowerShell 5.1, save
the bytes as they arrive — Invoke-WebRequest ... -OutFile transcript.txt — instead of piping
.Content through Out-File, which re-encodes text in the system code page and garbles
non-Latin characters. PowerShell 7 writes UTF-8 by default.
json exists for the machine on the other end: md and txt flatten everything into prose,
so an archive exported as either loses the timings and the speaker ids. json keeps them,
which is what lets the same archive be loaded into a database later.
A Markdown export looks like:
---
title: Acme — discovery call
date: 2026-05-20
language: en
duration: 30m 40s
speakers: [Alex, Jordan]
topics: [Pricing, Onboarding]
source: Specala AI
---
# Acme — discovery call
## Summary
Walked through current workflow and pain points...
## Action items
- Send pricing deck by Friday
- Schedule technical follow-up
## Transcript
[00:00] Alex: Thanks for hopping on...
[00:42] Jordan: Of course...Request
curl "https://app.specala.ai/api/v1/developer/transcriptions/3fa85f64-5717-4562-b3fc-2c963f66afa6/export?format=md" \
-H "Authorization: Bearer sk_live_your_key_here" \
-o "acme-discovery-call.md"The -o flag saves the file; the server-suggested name is in the Content-Disposition header.
import httpx
tid = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
resp = httpx.get(
f"https://app.specala.ai/api/v1/developer/transcriptions/{tid}/export",
params={"format": "md"},
headers={"Authorization": "Bearer sk_live_your_key_here"},
)
resp.raise_for_status()
with open("acme-discovery-call.md", "wb") as f:
f.write(resp.content)import { writeFile } from "node:fs/promises";
const tid = "3fa85f64-5717-4562-b3fc-2c963f66afa6";
const res = await fetch(
`https://app.specala.ai/api/v1/developer/transcriptions/${tid}/export?format=md`,
{ headers: { Authorization: "Bearer sk_live_your_key_here" } },
);
await writeFile("acme-discovery-call.md", Buffer.from(await res.arrayBuffer()));Export the Acme discovery call to ~/notes/meetings as markdown.
The assistant calls specala_export_transcription with output_path, writing the file directly —
the transcript never enters the conversation, saving tokens.
Exporting many at once?
To export more than one transcription, use Bulk export — one request returns a ZIP of up to 100 files.
Errors
| Status | When |
|---|---|
401 | Missing/invalid key, or key passed in the URL. |
403 | Plan without API access. |
404 | No transcription with that id in this workspace. |
422 | format is not md or txt. |
429 | Rate limit exceeded. |
See Errors.