Meetings API
Endpoints
Section titled “Endpoints”All endpoints require authentication and meetings tool permission.
List Meetings
Section titled “List Meetings”GET /api/meetingsQuery parameters:
| Param | Type | Description |
|---|---|---|
page | number | Page number (default: 1) |
per_page | number | Items per page (default: 20, max: 50) |
category | string | Filter by AI category |
entity_type | string | Filter by matched entity type |
entity_id | string | Filter by matched entity ID |
attendee_user_id | string | Filter by attendee user ID |
unmatched | boolean | Show only unmatched meetings |
date_from | string | Filter from date (ISO 8601) |
date_to | string | Filter to date (ISO 8601) |
search | string | Search title and summary |
Response includes visibility scoping based on user’s access level.
Get Meeting
Section titled “Get Meeting”GET /api/meetings/:idReturns meeting detail with attendees, action items, and match info.
Get Meeting Transcript
Section titled “Get Meeting Transcript”GET /api/meetings/:id/transcriptLazy-fetches transcript from Granola API and caches in D1. Returns cached version on subsequent requests.
Match Meeting
Section titled “Match Meeting”POST /api/meetings/:id/matchRequires can_update permission.
Body:
{ "entity_type": "company", "entity_id": "abc123"}Unmatch Meeting
Section titled “Unmatch Meeting”POST /api/meetings/:id/unmatchClears the matched entity.
Update Action Item Status
Section titled “Update Action Item Status”POST /api/meetings/:id/action-items/:actionId/statusBody:
{ "status": "done"}Valid statuses: pending, done, dismissed.
Re-analyse Meeting
Section titled “Re-analyse Meeting”POST /api/meetings/:id/reanalyseTriggers AI re-categorisation. Returns 202 Accepted.
Meeting Stats
Section titled “Meeting Stats”GET /api/meetings/statsReturns { unmatched_count: number } for sidebar badge.
Admin Endpoints
Section titled “Admin Endpoints”Require admin access.
Trigger Sync
Section titled “Trigger Sync”POST /api/admin/connections/granola/syncReturns 202 Accepted. Sync runs in the background.
Sync Status
Section titled “Sync Status”GET /api/admin/connections/granola/statusReturns:
{ "connected": true, "last_synced_at": "2026-03-27T10:00:00Z", "sync_interval_minutes": 5, "sync_enabled": true, "total_notes": 247, "unmatched_count": 12}Database Tables
Section titled “Database Tables”meetings— Core meeting data (PK: Granola note ID)meeting_attendees— Attendees with email→user resolutionmeeting_transcripts— Cached transcripts (lazy-fetched)meeting_action_items— AI-extracted and manual action items