Specala AIDocs
API Reference

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

ParameterTypeDescription
idUUIDTranscription identifier.

Query parameters

ParameterTypeDefaultDescription
formatstringmdmd (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:

FormatContent-TypeContents
mdtext/markdown; charset=utf-8YAML frontmatter + transcript + AI reports. UTF-8 with BOM
txttext/plain; charset=utf-8Plain transcript text. UTF-8 with BOM
jsonapplication/json; charset=utf-8Exactly 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:

Acme — discovery call.md
---
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

StatusWhen
401Missing/invalid key, or key passed in the URL.
403Plan without API access.
404No transcription with that id in this workspace.
422format is not md or txt.
429Rate limit exceeded.

See Errors.

On this page