A Node.js service that provides a REST API to start and monitor real-time transcriptions from Fireflies.ai.
- Start a real-time transcription session for a Fireflies.ai meeting
- Monitor the status of transcription requests
- Store transcription data in Supabase
- Automatic reconnection handling for WebSocket connections
- Configurable buffering of transcription chunks
- Manually stop an active transcription session via API
- Automatic 10-minute inactivity timer to stop sessions if no speech is detected from Fireflies
- Node.js 16.x or later
- npm or yarn
- Supabase account and project
- Fireflies.ai API key with access to the Realtime API
- Clone the repository
- Install dependencies:
npm install
- Copy
.env.exampleto.envand update the values:cp .env.example .env
- Update the
.envfile with your Supabase and Fireflies.ai credentials
| Variable | Description | Required | Default |
|---|---|---|---|
| PORT | Port to run the server on | No | 3000 |
| NODE_ENV | Node environment | No | development |
| SUPABASE_URL | Supabase project URL | Yes | |
| SUPABASE_ANON_KEY | Supabase anonymous key | Yes | |
| SUPABASE_SERVICE_ROLE_KEY | Supabase service role key | Yes | |
| FIREFLIES_API_KEY | Fireflies.ai API key | Yes | |
| LOG_LEVEL | Logging level | No | info |
POST /api/transcription/startInitiates a real-time transcription for the given Fireflies.ai transcriptionId.
Request Body:
{
"transcriptionId": "your-fireflies-transcription-id",
"requestId": "your-optional-client-provided-uuid"
}transcriptionId(string, required): The transcription ID from Fireflies.ai.requestId(string, optional): A client-provided UUID for the request. If not provided, the server will generate one.
Success Response (202):
{
"requestId": "server-generated-or-client-provided-uuid",
"status": "processing",
"message": "Transcription process initiated successfully."
}GET /api/transcription/status/:requestIdRetrieves the current status and content of a transcription request.
URL Parameters:
requestId(string, required): The ID of the transcription request (returned by the/startendpoint).
Success Response (200):
{
"requestId": "unique-request-id",
"status": "processing", // or "completed", "error"
"content": "Transcription content...",
"error": null, // or an error message string
"createdAt": "2023-01-01T00:00:00.000Z",
"updatedAt": "2023-01-01T00:01:00.000Z"
}POST /api/transcription/stopManually stops an active transcription session.
Request Body:
{
"requestId": "unique-request-id-from-start"
}requestId(string, required): The ID of the transcription request to stop (returned by the/startendpoint).
Success Response (200):
{
"requestId": "unique-request-id-from-start",
"status": "completed",
"message": "Transcription session stopped successfully."
}| Column | Type | Description |
|---|---|---|
| id | UUID | Primary key |
| transcription_id | TEXT | Fireflies.ai transcription ID |
| status | TEXT | Current status (processing/completed/error) |
| content | TEXT | Transcription content |
| error_message | TEXT | Error message if status is error |
| created_at | TIMESTAMP | When the request was created |
| updated_at | TIMESTAMP | When the request was last updated |
| last_event_at | TIMESTAMP | When the last event was received |
npm run devnpm run build
npm startThis service is designed to be deployed as a long-running process. It is not suitable for serverless environments due to the persistent WebSocket connection requirement.
Recommended deployment options:
- Containerized deployment (Docker) on platforms like:
- Google Cloud Run (with CPU always allocated)
- AWS ECS/Fargate
- Azure Container Instances
- DigitalOcean App Platform
- Traditional VM/Server (e.g., AWS EC2, Google Compute Engine)
MIT