Documentation/API Reference

    API Reference

    External integrations use the Meetric partner REST API under /rest with mt_* bearer tokens.

    Getting Started#

    REST Contract

    OpenAPI schema is the source of truth

    Scoped Tokens

    Every endpoint is controlled by token scopes

    Rate Limited

    Per-token limits and daily conversation quotas

    Base URL and OpenAPI#

    text
    REST API base URL: http://127.0.0.1:42969/api/v1/rest
    text
    OpenAPI spec: http://127.0.0.1:42969/api/v1/rest/openapi.json

    Note

    Use the OpenAPI spec above as the canonical endpoint and schema reference.

    Authentication#

    Bearer token request
    curl -X GET "http://127.0.0.1:42969/api/v1/rest/conversations?limit=25" \
      -H "Authorization: Bearer mt_your_api_token"

    Generate tokens in Settings -> API Tokens. Tokens are shown once and should be stored securely.

    Warning

    External partner integrations should use /rest endpoints only. Internal JWT endpoints under /api/v1 are not part of this partner API contract.

    Endpoint Contract#

    Current partner API endpoints and required scopes, aligned with the REST OpenAPI contract.

    MethodPathScopeDescription
    GET/rest/accountnoneGet account and branding context
    GET/rest/usersusersList active users in account
    GET/rest/teamsteamsList teams with members
    GET/rest/departmentsdepartmentsList enabled departments
    GET/rest/conversationsconversationsList conversations (30-day window, cursor pagination)
    GET/rest/conversations/:idconversationsGet conversation detail (optional transcript/insights includes)
    GET/rest/conversations/:id/transcripttranscriptsGet transcript payload for one conversation
    GET/rest/conversations/:id/insightsinsightsGet insights/topics for one conversation
    GET/rest/conversations/:id/recording-urlrecordings + include_recordings=trueGet recording URL if available
    GET/rest/conversations/:id/summaryconversationsGet stored summary text for one conversation
    POST/rest/notetaker/requestnotetakerRequest notetaker join for supported meeting URL
    GET/rest/webhooks/deliveriesnoneList recent webhook deliveries (last 7 days)

    Note

    GET /rest/conversations is limited to the last 30 days and max limit=25 per page. Use pagination.next_cursor for additional pages.

    Transcript Endpoint#

    GET /rest/conversations/:id/transcript#

    Request
    curl -X GET "http://127.0.0.1:42969/api/v1/rest/conversations/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/transcript" \
      -H "Authorization: Bearer mt_your_api_token"
    Response
    {
      "conversation_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
      "transcript": {
        "sentences": [
          {
            "speaker_name": "Erik Lindstrom",
            "start": 0.84,
            "end": 3.14,
            "text": "Thanks for joining today."
          }
        ]
      },
      "_meta": {
        "token_prefix": "mt_ab12cd34",
        "timestamp": "2026-06-03T09:42:00.000Z"
      }
    }

    Tip

    Transcript shape follows stored transcript_data. Some sources use sentences, others use messages. You can also use GET /rest/conversations/:id?include_transcript=true to embed transcript in conversation detail.

    Webhooks#

    Webhook deliveries use event conversation.completed with signed requests.

    Delivery headers
    X-Webhook-Signature: sha256=<hmac_sha256_of_raw_body>
    X-Webhook-Event: conversation.completed
    X-Webhook-Delivery-Id: <delivery_uuid>
    X-Webhook-Timestamp: <unix_timestamp_seconds>
    conversation.completed payload
    {
      "event": "conversation.completed",
      "timestamp": "2026-06-03T09:45:00.000Z",
      "data": {
        "conversation": {
          "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
          "title": "Discovery call - Acme",
          "company": "Acme",
          "date": "2026-06-03T09:30:00.000Z",
          "duration": 1800,
          "medium": "call",
          "sentiment": "positive",
          "conversation_type": "sales",
          "summary": "Customer requested pricing follow-up.",
          "department": { "id": "11111111-0000-0000-0000-000000000001", "name": "B2B Sales" },
          "user": { "id": "67c869eb-30b1-4eb3-bd2c-be8c912a9827", "name": "Erik Lindstrom", "email": "[email protected]" },
          "participants": [
            { "name": "Jane Doe", "email": "[email protected]", "role": "customer" }
          ],
          "transcript": { "sentences": [] },
          "insights": [],
          "recording_url": "https://example.com/recording"
        }
      },
      "_meta": {
        "token_prefix": "mt_ab12cd34",
        "delivery_id": "bbbbbbbb-cccc-dddd-eeee-ffffffffffff"
      }
    }

    Note

    Optional conversation fields are scope-dependent: transcript requires transcripts, insights requires insights, and recording_url requires recordings scope plus token recording access.

    Warning

    If your account has not enabled automatic webhook dispatch yet, use transcript polling via /rest/conversations/:id/transcript and treat webhooks as optional until rollout completes.

    Limits and Errors#

    Rate Limits#

    json
    {
      "requests_per_minute": 60,
      "daily_conversation_quota": 1000
    }

    Limits are configured per token. Daily quota counts unique conversations accessed per day.

    HTTP Status Codes#

    • 200 - request succeeded
    • 400 - invalid parameters
    • 401 - missing, invalid, revoked, or expired token
    • 403 - required scope missing
    • 404 - resource not found for this token/account scope
    • 429 - rate limit exceeded
    • 500 - internal server error
    Example error payload
    {
      "statusCode": 403,
      "message": "Token does not have the 'transcripts' scope",
      "error": "Forbidden"
    }

    Support#

    Note

    Questions about integration behavior or contract details? Email [email protected].