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/resttext
OpenAPI spec: http://127.0.0.1:42969/api/v1/rest/openapi.jsonNote
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.
| Method | Path | Scope | Description |
|---|---|---|---|
| GET | /rest/account | none | Get account and branding context |
| GET | /rest/users | users | List active users in account |
| GET | /rest/teams | teams | List teams with members |
| GET | /rest/departments | departments | List enabled departments |
| GET | /rest/conversations | conversations | List conversations (30-day window, cursor pagination) |
| GET | /rest/conversations/:id | conversations | Get conversation detail (optional transcript/insights includes) |
| GET | /rest/conversations/:id/transcript | transcripts | Get transcript payload for one conversation |
| GET | /rest/conversations/:id/insights | insights | Get insights/topics for one conversation |
| GET | /rest/conversations/:id/recording-url | recordings + include_recordings=true | Get recording URL if available |
| GET | /rest/conversations/:id/summary | conversations | Get stored summary text for one conversation |
| POST | /rest/notetaker/request | notetaker | Request notetaker join for supported meeting URL |
| GET | /rest/webhooks/deliveries | none | List 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].