MeetCapture API Reference

Access your meeting sessions, transcripts, and recordings programmatically. The MeetCapture API is built on Supabase and supports both REST and Edge Function endpoints.

Base URL

https://xrhwfuquudleamotznzx.supabase.co

Authentication

MeetCapture supports API keys for server-side Edge Function calls and Supabase Auth JWTs for direct PostgREST table access.

Option 1: API Key (recommended for server-to-server)

Generate an API key from your dashboard. Include it in the x-api-key header when calling MeetCapture Edge Functions.

curl -H "x-api-key: mc_live_your_key_here" \
  "https://xrhwfuquudleamotznzx.supabase.co/functions/v1/mc-api-sessions?limit=10"

Option 2: JWT Bearer Token (for browser/user context)

Use the Supabase Auth JWT in the Authorization header for direct table reads through Supabase PostgREST.

curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "apikey: YOUR_SUPABASE_ANON_KEY" \
  https://xrhwfuquudleamotznzx.supabase.co/rest/v1/mc_sessions

REST API

MeetCapture exposes standard REST endpoints via Supabase PostgREST for authenticated Supabase users. For API-key access, use the Edge Function endpoints below.

EndpointDescription
GET /rest/v1/mc_sessionsList all meeting sessions
GET /rest/v1/mc_sessions?id=eq.{id}Get a single session by ID
GET /rest/v1/mc_transcriptsList all transcripts
GET /rest/v1/mc_transcripts?session_id=eq.{id}Get transcript for a session
GET /rest/v1/mc_transcript_segmentsList transcript segments with timestamps
GET /rest/v1/mc_recordingsList all recordings (audio/video)

Sessions

A session represents a single meeting capture. It contains metadata about the platform, timing, and status.

List all sessions

curl -X GET \
  "https://xrhwfuquudleamotznzx.supabase.co/functions/v1/mc-api-sessions?limit=10" \
  -H "x-api-key: mc_live_your_key"

Response Schema

FieldTypeDescription
iduuidUnique session identifier
user_iduuidOwner user ID
titletextMeeting title (e.g. 'Weekly Standup')
platformtextMeeting platform (zoom, teams, google_meet, slack)
statustextSession status (active, completed, error)
started_attimestamptzWhen capture started
ended_attimestamptzWhen capture ended
duration_secsintegerDuration in seconds
created_attimestamptzRecord creation time

Transcripts

Transcripts contain the full text and individual segments (with timestamps and speakers) for each session.

Get transcript with segments

# SESSION_UUID is the mc_sessions.id value.
curl -X GET \
  "https://xrhwfuquudleamotznzx.supabase.co/functions/v1/mc-api-sessions?id=SESSION_UUID" \
  -H "x-api-key: mc_live_your_key"

Segment Schema

FieldTypeDescription
texttextTranscribed text content
speakertextSpeaker name or identifier
start_time_msintegerStart timestamp in milliseconds
end_time_msintegerEnd timestamp in milliseconds
confidencefloatTranscription confidence (0.0 - 1.0)
segment_indexintegerOrdering index within transcript

Recordings

Access audio and video recording metadata. Files are stored in Supabase Storage and can be downloaded via signed URLs.

# The detail response includes recordings, transcript, and segments.
curl -X GET \
  "https://xrhwfuquudleamotznzx.supabase.co/functions/v1/mc-api-sessions?id=SESSION_UUID" \
  -H "x-api-key: mc_live_your_key"

Edge Functions

Server-side edge functions handle complex operations like upload token generation and webhook delivery. These run on Supabase Edge (Deno Deploy).

GET/functions/v1/mc-api-sessions

List sessions with pagination and filters. Add an id query parameter to retrieve one session with its recordings, transcript, and segments.

# List sessions with an API key
curl "https://xrhwfuquudleamotznzx.supabase.co/functions/v1/mc-api-sessions?limit=10&platform=zoom" \
  -H "x-api-key: mc_live_your_key"

# Get one session with transcript segments
curl "https://xrhwfuquudleamotznzx.supabase.co/functions/v1/mc-api-sessions?id=SESSION_UUID" \
  -H "Authorization: Bearer USER_SUPABASE_JWT"
POST/functions/v1/mc-api-upload-token

Generate a scoped signed upload URL for the desktop app to upload a recording directly to the private mc-recordings bucket.

curl -X POST \
  "https://xrhwfuquudleamotznzx.supabase.co/functions/v1/mc-api-upload-token" \
  -H "x-api-key: mc_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{"session_id": "SESSION_UUID", "file_name": "recording.wav", "content_type": "audio/wav"}'
POST/functions/v1/mc-webhook-deliver

Internal function that delivers webhook payloads to registered endpoints. Called automatically by database triggers when events occur.

{
  "event": "session.completed",
  "session_id": "abc123",
  "timestamp": "2026-04-04T12:00:00Z"
}

Webhooks

Register webhook endpoints from your dashboard to receive real-time notifications when events occur. All payloads are signed with HMAC-SHA256 using your endpoint secret.

Available Events

EventDescription
session.completedMeeting session ended and all processing is complete
recording.savedAudio or video recording file has been saved to storage
transcript.completedTranscription has finished for a session
*Wildcard - receive all event types

Example Payload

Webhook Payloadjson
{
  "event": "session.completed",
  "timestamp": "2026-04-04T12:30:00Z",
  "data": {
    "session_id": "550e8400-e29b-41d4-a716-446655440000",
    "platform": "zoom",
    "title": "Weekly Team Standup",
    "duration_seconds": 1800,
    "transcript_segment_count": 42,
    "recording_count": 1
  }
}

Verifying Signatures

Each webhook request includes a X-MeetCapture-Signature header. Verify it with HMAC-SHA256 using your endpoint secret.

import crypto from "crypto";

function verifyWebhook(payload, signature, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(payload)
    .digest("hex");

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

// In your Express handler:
app.post("/webhooks/meetcapture", (req, res) => {
  const sig = req.headers["x-meetcapture-signature"];
  const valid = verifyWebhook(JSON.stringify(req.body), sig, WEBHOOK_SECRET);

  if (!valid) return res.status(401).send("Invalid signature");
  // Process the event...
  res.sendStatus(200);
});

Error Handling

The API uses standard HTTP status codes. Error responses include a message explaining what went wrong.

StatusMeaning
200Success
201Created (resource created successfully)
400Bad Request (invalid parameters)
401Unauthorized (missing or invalid auth)
403Forbidden (valid auth but insufficient permissions)
404Not Found (resource does not exist)
429Rate Limited (too many requests)
500Internal Server Error
Error Response Examplejson
{
  "message": "Invalid API key",
  "code": "INVALID_API_KEY",
  "hint": "Check that your API key is active and correctly formatted"
}

Need help?

Reach out to our team for integration support.