Bulk export
POST /transcriptions/export — export up to 100 transcriptions as a single ZIP archive in one request.
POST /transcriptions/export
Export many transcriptions at once. Returns a ZIP archive — one request regardless of count (1–100 per call). Far faster and cheaper than calling Export in a loop.
Request body
{
"ids": [
"3fa85f64-5717-4562-b3fc-2c963f66afa6",
"7c9e6679-7425-40de-944b-e07fc1f90ae7"
],
"format": "md"
}| Field | Type | Default | Description |
|---|---|---|---|
ids | UUID[] | — | 1–100 transcription IDs. Required. |
format | string | md | md or txt. |
Request
curl -X POST https://app.memoai.tech/api/v1/developer/transcriptions/export \
-H "Authorization: Bearer mk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"ids": ["3fa85f64-5717-4562-b3fc-2c963f66afa6", "7c9e6679-7425-40de-944b-e07fc1f90ae7"],
"format": "md"
}' \
-o transcriptions.zipimport httpx
resp = httpx.post(
"https://app.memoai.tech/api/v1/developer/transcriptions/export",
headers={"Authorization": "Bearer mk_live_your_key_here"},
json={
"ids": [
"3fa85f64-5717-4562-b3fc-2c963f66afa6",
"7c9e6679-7425-40de-944b-e07fc1f90ae7",
],
"format": "md",
},
)
resp.raise_for_status()
with open("transcriptions.zip", "wb") as f:
f.write(resp.content)import { writeFile } from "node:fs/promises";
const res = await fetch(
"https://app.memoai.tech/api/v1/developer/transcriptions/export",
{
method: "POST",
headers: {
Authorization: "Bearer mk_live_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
ids: [
"3fa85f64-5717-4562-b3fc-2c963f66afa6",
"7c9e6679-7425-40de-944b-e07fc1f90ae7",
],
format: "md",
}),
},
);
await writeFile("transcriptions.zip", Buffer.from(await res.arrayBuffer()));Export all my meetings from last week to ~/notes/meetings.
The assistant lists the week's transcriptions, then calls memo_bulk_export with their IDs and an
output_dir. It downloads the ZIP and unpacks the files for you in one step.
Response
200 OK — a ZIP archive (Content-Type: application/zip, Content-Disposition: attachment; filename="transcriptions.zip"). Each entry is a file named after its meeting title.
Partial results are silent
IDs that don't exist or aren't in your workspace are skipped — they don't cause an error. If
two meetings share a title, filenames are de-duplicated (name (2).md). Compare the number of
files in the ZIP against the IDs you sent to detect skips.
Errors
| Status | When |
|---|---|
401 | Missing/invalid key, or key passed in the URL. |
403 | Plan without API access. |
422 | ids empty or over 100, or format invalid. |
429 | Rate limit exceeded. |
See Errors.