API
Written By Anton
Last updated 14 days ago
MeetMic exposes a local REST API that lets you integrate with AI agents, automation tools, and custom scripts. All data stays on your Mac - the server runs locally and nothing is sent anywhere.
The Developer API requires a MeetMic Pro license, and is available in the direct-download build only (not in the Mac App Store version).
API version: v1
Getting Started
Open Settings → Developer API
Enable Local API Server
The server starts on
http://127.0.0.1:52778by default
Prefer the terminal? Open Settings → Command Line and install the meetmic CLI. It talks to the app over a private unix socket — no port, no token — and can also run as an MCP server for Claude, Cursor and other MCP clients. Docs: https://github.com/meetmic/meetmic-cli
Configuration
Authentication
GET routes are open — the server only listens on the loopback interface, so only apps running on your Mac can reach it.
POST (mutating) routes require the API token as a bearer token:
Authorization: Bearer <your-token>Copy the token from Settings → Developer API. Regenerating it immediately invalidates any integration still using the old one.
Endpoints
All endpoints return JSON with Content-Type: application/json; charset=utf-8. Durations and segment timestamps are in milliseconds.
Status — GET /api/v1/status
Returns server status, app version, license readiness, and the currently active models.
Response
{
"status": "ok",
"version": "1.32",
"apiVersion": "v1",
"ready": true,
"fullAccess": true,
"activeVoiceModel": {
"id": "large-v3-turbo",
"name": "Large V3 Turbo"
},
"activeIntelligenceModel": {
"id": "gpt-4o",
"provider": "OpenAI",
"displayName": "GPT-4o"
}
}ready reports whether the license check has completed; fullAccess whether this install has Pro. activeIntelligenceModel is omitted when no AI model is configured.
List transcription models — GET /api/v1/transcription-models
Lists all transcription (speech-to-text) models.
Response
{
"models": [
{
"id": "large-v3-turbo",
"name": "Large V3 Turbo",
"provider": "openAI",
"isActive": true,
"isDownloaded": true,
"isCloud": false
},
{
"id": "parakeet-tdt-0.6b-v3",
"name": "Parakeet TDT 0.6b v3",
"provider": "nvidia",
"isActive": false,
"isDownloaded": false,
"isCloud": false
}
]
}Active transcription model — GET /api/v1/transcription-models/active
Response
{
"id": "large-v3-turbo",
"name": "Large V3 Turbo",
"provider": "openAI",
"isDownloaded": true,
"isCloud": false
}Set active transcription model — POST /api/v1/transcription-models/active
Requires the bearer token. Send the model id from the list endpoint.
Request
curl -X POST http://127.0.0.1:52778/api/v1/transcription-models/active \
-H "Authorization: Bearer $MEETMIC_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id": "large-v3-turbo"}'Response
{
"id": "large-v3-turbo",
"name": "Large V3 Turbo",
"active": true
}Returns 422 for an unknown model, 403 if the model needs Pro, and 422 with "code": "model_not_downloaded" if the model has not been downloaded in MeetMic yet.
List AI models — GET /api/v1/ai-models
AI models are the LLM configurations used for summaries and other AI features.
Response
{
"models": [
{
"id": "9F2A5C40-8B1E-4E7D-9F3B-1C2D3E4F5A6B",
"provider": "OpenAI",
"name": "GPT-4o",
"modelId": "gpt-4o",
"isActive": true,
"isLocal": false,
"isAvailable": true
}
]
}id is the configuration's UUID — that is what the select endpoint expects. modelId is the provider's own model name. isAvailable reports whether the configuration is usable right now (local weights downloaded, Apple Intelligence present, and so on); cloud configurations are always available.
Active AI model — GET /api/v1/ai-models/active
Response
{
"id": "9F2A5C40-8B1E-4E7D-9F3B-1C2D3E4F5A6B",
"provider": "OpenAI",
"name": "GPT-4o",
"modelId": "gpt-4o",
"isLocal": false,
"isAvailable": true
}Set active AI model — POST /api/v1/ai-models/active
Requires the bearer token. Send the configuration UUID.
Request
curl -X POST http://127.0.0.1:52778/api/v1/ai-models/active \
-H "Authorization: Bearer $MEETMIC_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id": "9F2A5C40-8B1E-4E7D-9F3B-1C2D3E4F5A6B"}'Response
{
"id": "9F2A5C40-8B1E-4E7D-9F3B-1C2D3E4F5A6B",
"name": "GPT-4o",
"active": true
}Returns 422 with "code": "unknown_model" if no configuration matches that id.
List transcriptions — GET /api/v1/transcriptions
Lists everything in your history. duration is in milliseconds.
Response
{
"count": 42,
"transcriptions": [
{
"id": "B2DDF22B-C0B2-4A42-83D4-D1D4A34EC362",
"name": "Recording 2026-02-23 at 15.22.06",
"category": "recording",
"date": "2026-02-23T04:22:47Z",
"modified": "2026-02-23T04:22:47Z",
"duration": 36394
}
]
}Full transcript — GET /api/v1/transcriptions/:id
Returns the full transcript for one transcription, including segments, speakers, and metadata.
Response
{
"id": "B2DDF22B-C0B2-4A42-83D4-D1D4A34EC362",
"name": "Meeting Notes",
"category": "recording",
"date": "2026-02-23T04:22:47Z",
"modified": "2026-02-23T05:12:00Z",
"isTranscribed": true,
"language": "en",
"voiceModel": "large-v3-turbo",
"segmentCount": 128,
"speakers": [
{
"id": "E51D01F4-E4E2-4D29-A089-C4D814D08287",
"name": "Speaker 2"
}
],
"segments": [
{
"id": "35CFDCDE-827E-4FE7-B237-C3EB8FB72B87",
"start": 26080,
"end": 35920,
"text": "Sample segment",
"label": "Highlight",
"speaker": {
"id": "E51D01F4-E4E2-4D29-A089-C4D814D08287",
"name": "Speaker 2"
}
}
]
}speaker, label, and comment appear on a segment only when set.
Most recent transcript — GET /api/v1/transcriptions/recent
Same payload as above, for the most recently modified transcription.
Latest summary — GET /api/v1/transcriptions/:id/summary
Returns the most recent stored AI summary for a transcription. 404 when there is none.
Response
{
"id": "B2DDF22B-C0B2-4A42-83D4-D1D4A34EC362",
"summary": "The team discussed Q1 goals and assigned action items..."
}All summaries — GET /api/v1/transcriptions/:id/summaries
Returns every stored summary for a transcription, newest first. Ids with no summaries return an empty array rather than 404.
Response
{
"count": 2,
"summaries": [
{
"id": "0B4E9C2A-7D31-4A58-9C1F-2E5B6A7D8C90",
"createdAt": "2026-02-23T05:10:14Z",
"text": "The team discussed Q1 goals and assigned action items...",
"promptTitle": "Meeting notes",
"model": "GPT-4o"
}
]
}Transcribe audio — POST /api/v1/transcriptions
Uploads an audio or video file and starts a transcription. Requires the bearer token. Send the raw file bytes as the request body — this is not a multipart form.
The call returns immediately with 202 Accepted and a job id you poll.
Request
curl -X POST http://127.0.0.1:52778/api/v1/transcriptions \
-H "Authorization: Bearer $MEETMIC_TOKEN" \
-H "X-MeetMic-Filename: meeting.m4a" \
--data-binary @meeting.m4aResponse — 202 Accepted
{
"jobId": "3F7C1D9E-4A2B-4C8E-9D0F-1A2B3C4D5E6F",
"status": "pending",
"statusUrl": "/api/v1/transcriptions/status/3F7C1D9E-4A2B-4C8E-9D0F-1A2B3C4D5E6F"
}Job status — GET /api/v1/transcriptions/status/:id
Polls a transcription started with POST /api/v1/transcriptions. Requires the bearer token.
status is one of pending, running, done, or failed. pending and running carry progress only; done inlines the full result; failed carries the error message. Finished jobs are dropped an hour after they complete, so fetch the result before then — or transcribe with X-MeetMic-Persist: true and read it back from History later.
Response — while running
{
"jobId": "3F7C1D9E-4A2B-4C8E-9D0F-1A2B3C4D5E6F",
"status": "running",
"progress": 0.42
}Response — when done
{
"jobId": "3F7C1D9E-4A2B-4C8E-9D0F-1A2B3C4D5E6F",
"status": "done",
"persisted": true,
"model": "large-v3-turbo",
"language": "en",
"text": "Full transcript text...",
"segmentCount": 2,
"segments": [
{
"start": 0,
"end": 3120,
"text": "Good morning everyone.",
"speaker": "Speaker 1"
}
]
}Errors
Errors are JSON: {"error": "..."}, sometimes with a machine-readable "code".