API Reference
Build custom integrations and automate workflows with Meetric's REST API. Access conversations, insights, and more programmatically.
Getting Started#
RESTful
Standard HTTP methods and JSON responses
Secure
API key or OAuth 2.0 authentication
Fast
Low latency with global CDN
Base URL#
Workspace API: http://127.0.0.1:43131/api/v1Note
Authentication#
Authenticate API requests using an API key or OAuth 2.0:
curl -X GET "http://127.0.0.1:43131/api/v1/conversations" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "X-Account-ID: your_account_id"Getting your API key:
- Navigate to Settings → API
- Click "Generate API Key"
- Name your key (e.g., "Production Integration")
- Set permissions (read-only or read-write)
- Copy the key (shown only once)
- Store securely - treat like a password
Warning
Rate Limits#
API requests are rate-limited to ensure service reliability.
Current Limits#
Starter
Business
Enterprise
Rate limits are per API key. Headers in responses indicate your current status:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1640995200Tip
Endpoints Overview#
Core API endpoints organized by resource type.
Conversations
Create, retrieve, update, and delete conversations
/conversationsList all conversations/conversations/:idGet conversation details/conversationsCreate conversation/conversations/:idUpdate conversation/conversations/:idDelete conversationInsights
Access AI-generated insights and analytics
/insightsList all insights/insights/:idGet specific insight/insights/trendsGet trend data/insights/summaryGet summary statisticsAction Items
Manage tasks and follow-ups
/action-itemsList action items/action-items/:idGet action item details/action-items/:idUpdate action item/action-itemsCreate action itemWorkspace Access
Manage users, teams, departments, and scoped manager assignments
/usersList users with role context/users/:userId/detailsUpdate user profile fields (admin)/users/:userId/roleUpdate account role/users/:userId/teamSet primary team membership/teams/:teamId/managersList team managers/teams/:teamId/managersAssign team manager/teams/:teamId/managers/:userIdRemove team manager/departments/:id/managersList department managers/departments/:id/managersAssign department manager/departments/:id/managers/:userIdRemove department managerNote
Conversations API#
Comprehensive examples for working with conversations.
List Conversations#
GET /api/v1/conversations?limit=20&offset=0&department=sales
curl -X GET "http://127.0.0.1:43131/api/v1/conversations?limit=20" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "X-Account-ID: your_account_id"{
"data": [
{
"id": "conv_abc123",
"title": "Q1 Planning with Acme Corp",
"date": "2024-01-15T10:30:00Z",
"duration": 3600,
"department": "sales",
"participants": [
{
"id": "user_123",
"name": "John Smith",
"email": "[email protected]"
}
],
"status": "processed",
"summary": "Discussed Q1 product roadmap and pricing...",
"sentiment": {
"score": 0.85,
"label": "positive"
},
"recording_url": "https://...",
"transcript_url": "https://...",
"created_at": "2024-01-15T10:00:00Z",
"updated_at": "2024-01-15T11:00:00Z"
}
],
"pagination": {
"total": 150,
"limit": 20,
"offset": 0,
"has_more": true
}
}Query Parameters:
limitintegeroffsetintegerdepartmentstringstart_datedateend_datedatestatusstringCreate Conversation#
POST /api/v1/conversations
curl -X POST "http://127.0.0.1:43131/api/v1/conversations" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "X-Account-ID: your_account_id" \
-H "Content-Type: application/json" \
-d '{
"title": "Client Discovery Call",
"date": "2024-01-15T14:00:00Z",
"department": "sales",
"participants": [
{
"name": "Jane Client",
"email": "[email protected]"
}
],
"recording_url": "https://example.com/recording.mp4",
"auto_process": true
}'{
"id": "conv_xyz789",
"title": "Client Discovery Call",
"status": "processing",
"created_at": "2024-01-15T14:05:00Z",
"estimated_completion": "2024-01-15T14:10:00Z"
}Insights API#
Get Insights#
GET /api/v1/insights?conversation_id=conv_abc123
curl -X GET "http://127.0.0.1:43131/api/v1/insights?conversation_id=conv_abc123" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "X-Account-ID: your_account_id"{
"data": [
{
"id": "insight_123",
"conversation_id": "conv_abc123",
"type": "action_item",
"content": "Send product specs to John by Friday",
"assigned_to": "user_456",
"due_date": "2024-01-20",
"status": "pending",
"confidence": 0.92,
"created_at": "2024-01-15T11:00:00Z"
},
{
"id": "insight_124",
"conversation_id": "conv_abc123",
"type": "topic",
"content": "Pricing Discussion",
"keywords": ["pricing", "discount", "annual contract"],
"relevance_score": 0.88
},
{
"id": "insight_125",
"conversation_id": "conv_abc123",
"type": "decision",
"content": "Agreed to proceed with Enterprise plan",
"participants": ["user_123", "user_456"]
}
]
}Webhooks#
Receive real-time notifications when events occur. See Integrations → Webhooks for setup.
Webhook Payload Structure#
{
"event": "conversation.processed",
"timestamp": "2024-01-15T11:00:00Z",
"account_id": "acc_123",
"data": {
"conversation_id": "conv_xyz789",
"title": "Client Discovery Call",
"status": "processed",
"duration": 1800,
"processing_time": 120,
"insights_count": 8,
"action_items_count": 3
},
"webhook_id": "wh_abc123",
"delivery_id": "del_456"
}Error Handling#
The API uses standard HTTP status codes and returns error details in JSON format.
HTTP Status Codes#
OK
Request succeeded
Created
Resource created successfully
Bad Request
Invalid request parameters
Unauthorized
Invalid or missing API key
Forbidden
Insufficient permissions
Not Found
Resource not found
Too Many Requests
Rate limit exceeded
Internal Server Error
Server error
Error Response Format#
{
"error": {
"code": "invalid_parameter",
"message": "The 'date' field must be in ISO 8601 format",
"param": "date",
"type": "validation_error",
"docs_url": "http://127.0.0.1:43131/documentation/api#errors"
}
}Common Error Codes:
invalid_parameterRequest parameter is invalid or missingauthentication_failedAPI key is invalid or expiredrate_limit_exceededToo many requests in time windowresource_not_foundRequested resource doesn't existinsufficient_permissionsAPI key lacks required permissionsRetry Logic#
Implement exponential backoff for failed requests:
async function fetchWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await fetch(url, options);
if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After') || Math.pow(2, attempt);
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
continue;
}
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
return await response.json();
} catch (error) {
if (attempt === maxRetries - 1) throw error;
const delay = Math.pow(2, attempt) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}Code Examples#
Node.js Example#
const axios = require('axios');
const API_KEY = process.env.MEETRIC_API_KEY;
const ACCOUNT_ID = process.env.MEETRIC_ACCOUNT_ID;
const BASE_URL = 'http://127.0.0.1:43131/api/v1';
const Meetric = axios.create({
baseURL: BASE_URL,
headers: {
'Authorization': `Bearer ${API_KEY}`,
'X-Account-ID': ACCOUNT_ID,
'Content-Type': 'application/json'
}
});
// List conversations
async function getConversations() {
try {
const response = await Meetric.get('/conversations', {
params: {
limit: 10,
department: 'sales'
}
});
return response.data;
} catch (error) {
console.error('Error:', error.response?.data || error.message);
throw error;
}
}
// Create conversation
async function createConversation(data) {
try {
const response = await Meetric.post('/conversations', data);
console.log('Created:', response.data);
return response.data;
} catch (error) {
console.error('Error:', error.response?.data || error.message);
throw error;
}
}
// Usage
(async () => {
const conversations = await getConversations();
console.log('Found', conversations.pagination.total, 'conversations');
})();Python Example#
import requests
import os
API_KEY = os.environ['MEETRIC_API_KEY']
ACCOUNT_ID = os.environ['MEETRIC_ACCOUNT_ID']
BASE_URL = 'http://127.0.0.1:43131/api/v1'
class MeetricClient:
def __init__(self, api_key, account_id):
self.session = requests.Session()
self.session.headers.update({
'Authorization': f'Bearer {api_key}',
'X-Account-ID': account_id,
'Content-Type': 'application/json'
})
self.base_url = BASE_URL
def get_conversations(self, params=None):
response = self.session.get(
f'{self.base_url}/conversations',
params=params
)
response.raise_for_status()
return response.json()
def create_conversation(self, data):
response = self.session.post(
f'{self.base_url}/conversations',
json=data
)
response.raise_for_status()
return response.json()
# Usage
client = MeetricClient(API_KEY, ACCOUNT_ID)
# List conversations
conversations = client.get_conversations({
'limit': 10,
'department': 'sales'
})
print(f"Found {conversations['pagination']['total']} conversations")
# Create conversation
new_conv = client.create_conversation({
'title': 'Client Call',
'date': '2024-01-15T14:00:00Z',
'department': 'sales'
})
print(f"Created: {new_conv['id']}")Best Practices#
Use Pagination
Always paginate large result sets to avoid timeouts and reduce memory usage
Cache Responses
Cache API responses when data doesn't change frequently to reduce API calls
Handle Errors Gracefully
Implement proper error handling and retry logic with exponential backoff
Secure API Keys
Never expose API keys in client-side code or commit them to version control
Use Webhooks
For real-time updates, use webhooks instead of polling the API repeatedly
Version Your API Calls
Specify API version in requests to ensure compatibility with future changes
Note