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

  1. Open Settings → Developer API

  2. Enable Local API Server

  3. The server starts on http://127.0.0.1:52778 by 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

Setting

Default

Description

Base URL

http://127.0.0.1:[port]/api/v1

Server Port

52778

TCP port the server listens on

API Token

generated on first use

Required for POST (mutating) routes. Reveal, copy, or regenerate it in Settings → Developer API

Enable CORS

Off

Allow cross-origin requests from web applications

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.

Header

Required

Description

Authorization

yes

Bearer <your-token>

X-MeetMic-Model

no

Model id to use; defaults to the active transcription model

X-MeetMic-Persist

no

false transcribes without saving to History. Defaults to true

X-MeetMic-Filename

no

Original filename, used to detect the format

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.m4a

Response202 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".

Status

Meaning

400

Malformed request — empty audio body, invalid JSON, missing or invalid id

401

Missing or incorrect bearer token on a POST route

403

The requested model requires Pro

404

Unknown endpoint, transcription, job, or summary

422

Known request, unusable target — unknown model id, or a model that isn't downloaded (model_not_downloaded)

503

License check still pending (not_ready)