Quick start
Three calls to your first webhook.
Get your API key
Sign up at app.gregnote.com. Your live key starts with gk_live_.
Send your first bot
POST the meeting URL. The bot joins within 30 seconds.
curl -X POST https://api.gregnote.com/v1/bots \-H "Authorization: Bearer gk_live_YOUR_KEY" \-H "Content-Type: application/json" \-d '{"meeting_url": "https://meet.google.com/abc-def-ghi","bot_name": "Notetaker","webhook_url": "https://yourdomain.com/webhooks/gregnote"}'
Receive the webhook
When the meeting ends, we POST to your webhook_url with the full transcript.
// Express.js exampleapp.post('/webhooks/gregnote', (req, res) => {const sig = req.headers['gregnote-signature'];// verify HMAC-SHA256 sig firstconst { event, transcript } = req.body;if (event === 'meeting.completed') {console.log(transcript.segments);}res.status(200).json({ ok: true });});
Authentication
API keys
All requests must include your API key as a Bearer token in the Authorization header.
Live keys start with gk_live_. Test keys start with gk_test_. Keep your key secret. It cannot be recovered.
Authorization: Bearer gk_live_YOUR_KEY# Error responses401 "Invalid API key"403 "Key revoked"
Endpoints
All endpoints.
/v1/botsSend a bot to a meeting. Returns bot_id and status.
bots/v1/bots/:idFetch current bot status: joining, waiting, joined, ended, failed.
bots/v1/bots/:id/leaveManually remove the bot from the meeting.
bots/v1/meetings/:id/transcriptFetch the diarised transcript once the meeting has ended.
meetings/v1/meetings/:id/recordingGet a presigned URL to the raw audio recording (expires 1hr).
meetings/v1/audio/transcriptionsUpload an audio file (up to 500 MB) and receive a transcript.
stt/v1/transcriptionsQueue a large audio transcription job. Poll GET for status.
stt/v1/transcriptions/:idPoll transcription job status and retrieve result when complete.
stt/v1/webhooksRegister a new webhook endpoint and receive its signing secret.
webhooks/v1/webhooksList all registered webhook endpoints.
webhooksWebhooks
Event reference.
All webhook payloads are signed with HMAC-SHA256. Verify the Gregnote-Signature header before processing.
bot.joiningBot has been dispatched to the meeting
bot.waitingBot is in lobby waiting for host admission
bot.joinedBot is in the meeting and recording
bot.failedBot failed to join (meeting not found, kicked)
meeting.startedAudio capture has begun
meeting.endedMeeting ended; transcript being generated
meeting.completedTranscript ready, webhook includes full payload
transcription.queuedAsync STT job has been enqueued
transcription.completedAsync STT job finished; transcript included
transcription.failedSTT job failed; error detail included
recording.readyPresigned recording URL available
import { createHmac } from 'node:crypto';function verifyWebhook(body, sig, secret) {const [t, v1] = sig.split(',');const timestamp = t.replace('t=', '');const signature = v1.replace('v1=', '');const expected = createHmac('sha256', secret).update(`${timestamp}.${body}`).digest('hex');return expected === signature;}