Complete API reference for MeetingMind.
Last Updated: February 22, 2026
Production: https://api.meetingmind.com
All API requests require a valid JWT token from AWS Cognito.
Authorization: Bearer <your-jwt-token>Generate a presigned S3 URL for uploading meeting audio.
POST /upload-urlRequest Body:
{
"title": "Q1 Planning Meeting",
"teamId": "team-uuid" // Optional
}Response:
{
"uploadUrl": "https://s3.amazonaws.com/...",
"meetingId": "meeting-uuid",
"s3Key": "user-id__meeting-id__title.mp3"
}Get all meetings for the authenticated user.
GET /meetingsQuery Parameters:
teamId(optional): Filter by team IDstatus(optional): Filter by status (PENDING, DONE, FAILED)limit(optional): Number of results (default: 50)
Response:
{
"meetings": [
{
"meetingId": "uuid",
"title": "Q1 Planning",
"status": "DONE",
"createdAt": "2026-02-18T10:00:00Z",
"healthGrade": "A",
"healthScore": 95
}
]
}Get details for a specific meeting.
GET /meetings/{meetingId}Response:
{
"meetingId": "uuid",
"title": "Q1 Planning Meeting",
"status": "DONE",
"transcript": "Full transcript...",
"summary": "Meeting summary...",
"decisions": ["Decision 1", "Decision 2"],
"actionItems": [
{
"id": "action-1",
"task": "Finalize API docs",
"owner": "Ashhar",
"deadline": "2026-02-25",
"completed": false,
"status": "todo",
"riskScore": 45,
"riskLevel": "MEDIUM"
}
],
"followUps": ["Follow up 1"],
"roi": {
"cost": 150.00,
"value": 1200.00,
"roi": 700.0
},
"createdAt": "2026-02-18T10:00:00Z"
}Get all action items across all meetings.
GET /actionsQuery Parameters:
status(optional): Filter by status (todo, in_progress, blocked, done)owner(optional): Filter by owner nameteamId(optional): Filter by team ID
Response:
{
"actions": [
{
"id": "action-1",
"task": "Finalize API docs",
"owner": "Ashhar",
"deadline": "2026-02-25",
"completed": false,
"status": "todo",
"riskScore": 45,
"riskLevel": "MEDIUM",
"meetingId": "meeting-uuid",
"meetingTitle": "Q1 Planning"
}
]
}Update an action item.
PATCH /actions/{actionId}Request Body:
{
"status": "done",
"completed": true,
"owner": "New Owner",
"deadline": "2026-03-01"
}Response:
{
"message": "Action updated successfully",
"action": {
"id": "action-1",
"status": "done",
"completed": true,
"completedAt": "2026-02-20T15:30:00Z"
}
}Create a new team.
POST /teamsRequest Body:
{
"name": "Engineering Team"
}Response:
{
"teamId": "team-uuid",
"name": "Engineering Team",
"inviteCode": "ABC123",
"createdBy": "user@email.com",
"members": ["user@email.com"]
}Join a team using an invite code.
POST /teams/joinRequest Body:
{
"inviteCode": "ABC123"
}Response:
{
"message": "Successfully joined team",
"team": {
"teamId": "team-uuid",
"name": "Engineering Team"
}
}Get team details.
GET /teams/{teamId}Response:
{
"teamId": "team-uuid",
"name": "Engineering Team",
"createdBy": "user@email.com",
"members": [
"user1@email.com",
"user2@email.com"
],
"inviteCode": "ABC123",
"createdAt": "2026-02-18T10:00:00Z"
}Get all teams the user belongs to.
GET /teamsResponse:
{
"teams": [
{
"teamId": "team-uuid",
"name": "Engineering Team",
"memberCount": 5,
"role": "admin"
}
]
}Get meeting debt analytics.
GET /analytics/debtQuery Parameters:
teamId(optional): Filter by team ID
Response:
{
"totalDebt": 2500.00,
"overdueActions": 12,
"highRiskActions": 8,
"averageRiskScore": 45.5,
"debtTrend": "increasing"
}Find duplicate action items.
POST /actions/check-duplicatesRequest Body:
{
"actionId": "action-1"
}Response:
{
"duplicates": [
{
"actionId": "action-2",
"task": "Similar task",
"similarity": 0.95,
"meetingTitle": "Previous Meeting"
}
],
"isChronicBlocker": true,
"occurrenceCount": 4
}{
"error": "Invalid request",
"message": "Missing required field: title"
}{
"error": "Unauthorized",
"message": "Invalid or expired token"
}{
"error": "Forbidden",
"message": "You don't have permission to access this resource"
}{
"error": "Not found",
"message": "Meeting not found"
}{
"error": "Rate limit exceeded",
"message": "Too many requests. Please try again later."
}{
"error": "Internal server error",
"message": "An unexpected error occurred"
}- Rate Limit: 100 requests per minute per user
- Burst Limit: 20 requests per second
Rate limit headers:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1645123456Triggered when a meeting finishes processing.
{
"event": "meeting.completed",
"meetingId": "uuid",
"userId": "user@email.com",
"status": "DONE",
"timestamp": "2026-02-18T10:35:00Z"
}Triggered when an action item becomes overdue.
{
"event": "action.overdue",
"actionId": "action-1",
"task": "Finalize API docs",
"owner": "Ashhar",
"deadline": "2026-02-25",
"daysOverdue": 3,
"timestamp": "2026-02-28T09:00:00Z"
}import axios from 'axios';
const api = axios.create({
baseURL: 'https://api.meetingmind.com',
headers: {
'Authorization': `Bearer ${token}`
}
});
// List meetings
const meetings = await api.get('/meetings');
// Update action
await api.patch(`/actions/${actionId}`, {
status: 'done',
completed: true
});import requests
headers = {
'Authorization': f'Bearer {token}'
}
# List meetings
response = requests.get(
'https://api.meetingmind.com/meetings',
headers=headers
)
meetings = response.json()
# Update action
requests.patch(
f'https://api.meetingmind.com/actions/{action_id}',
headers=headers,
json={'status': 'done', 'completed': True}
)# List meetings
curl -X GET https://api.meetingmind.com/meetings \
-H "Authorization: Bearer YOUR_TOKEN"
# Update action
curl -X PATCH https://api.meetingmind.com/actions/action-1 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status": "done", "completed": true}'- Initial API release
- Meeting upload and processing
- Action item management
- Team collaboration
- Analytics endpoints