The API to get transcripts,
recordings, and metadata
from meetings.
POST a meeting URL. The bot joins the call, appears in the participant list, handles the waiting room, records audio, and fires a signed webhook with the full transcript when done. No polling. No browser automation. No platform SDK. £0.50/hr.
No credit card required. API key in 30 seconds.
£0.50
per hour captured
<30s
bot join time
1 key
no secondary accounts
4×
automatic webhook retries
The problem
Right now you're running multiple vendors for one feature.
A meeting bot provider for the bot. A speech-to-text service for transcription. Your own glue code to stitch them together. Two billing dashboards. Two points of failure.
Two weeks of setup before your first webhook fires.
How it works
Three steps. One afternoon.
POST to /v1/bots
Send the meeting URL and your webhook endpoint. The bot joins within 30 seconds.
Meeting runs
The bot appears in the meeting, handles the waiting room if needed, records audio, and diarises speakers by real name. No polling. No state machines. You do nothing.
Webhooks fire
When the meeting ends, signed webhooks deliver the full transcript, real speaker names, a presigned audio URL, and usage seconds. Or call /stop early to skip the wait.
Real API
Ship this today.
# Bot joins your meetingcurl -X POST https://api.gregnote.com/v1/bots \-H "Authorization: Bearer gk_live_xxx" \-d '{"meeting_url": "https://meet.google.com/abc-def-ghi","bot_name": "Gregnote Notetaker","webhook_url": "https://yourdomain.com/hooks/gregnote"}'
# Immediate response{"id": "bot_01JXYZ...","status": "joining","meeting_url": "https://meet.google.com/abc-def-ghi"}
# Fires automatically when meeting ends{"event": "meeting.completed","transcript": {"duration_seconds": 3420,"segments": [...],"speakers": [{ "display_name": "Sarah Chen", "is_bot": false },{ "display_name": "Gregnote Notetaker", "is_bot": true }]},"billable_seconds": 3420}
What you get
Everything included. Nothing missing.
Bot joins in seconds
POST a meeting URL. The bot navigates there, appears in the participant list as a named attendee, and handles the waiting room — all automatically. You write zero meeting platform code. Google Meet and Microsoft Teams today, Zoom coming soon.
Real names, not SPEAKER_00
Every speaker carries their real display name and an is_bot flag so you can filter the recording bot from your summaries in one line.
Direct audio STT
Upload audio files up to 500 MB. Receive the full transcript in under a minute.
Stop it when you're done
Call POST /v1/bots/:id/stop the moment the meeting ends. The transcript pipeline fires within seconds, not after a silence window. Your users don't wait.
Audio back too
recording.ready fires with a presigned URL to the normalised audio file. Build a playback UI, run your own STT pass, or archive it. The URL is yours for 24 hours.
Your brand in the room
Pass bot_image_url and your logo appears in the participant list. Pass bot_name per-request (Pro) and attendees see your product name, not ours. One field. White-labelled.
Full lifecycle events
bot.joining → bot.waiting → bot.joined → meeting.completed — every stage fires a signed webhook. HMAC-SHA256, 4-retry delivery at 0 s, 1 m, 5 m, 30 m, 2 h. No polling ever. Every attempt logged, replayable from the dashboard.
Metadata passthrough
Send your booking ID, user ID, or any JSON object. It comes back on every webhook event — bot, meeting, and transcription — untouched.
Your data, under control
Audio stored encrypted in Cloudflare R2. Transcripts kept 30 days and always accessible via API. Presigned URLs expire — no permanent public links.
Bot reliability
Meetings don't always go to plan.
Neither does a naive bot.
Every edge case your bot will hit in production — handled, surfaced as a machine-readable event, and documented so you can build the right recovery logic.
Waiting room
handledbot.waitingBot enters the lobby and waits. Your webhook receives the time it entered, the expected timeout, and a countdown. After 5 minutes without admission, a bot.failed event fires with error_code: WAITING_ROOM_TIMEOUT and a recovery hint to respawn.
Host denies admission
handledbot.failed · BOT_ADMISSION_DENIEDIf the host clicks 'Deny', the bot.failed event fires immediately with error_code: BOT_ADMISSION_DENIED — distinct from a network failure. The payload tells your code whether to show the user an error or silently skip.
Bot kicked mid-meeting
handledbot.failed · BOT_REMOVEDIf the host removes the bot after it has joined, the event fires with error_code: BOT_REMOVED. The recovery payload includes can_respawn: true and the original meeting URL so your code can re-join with one API call.
Meeting password
handledbot.waiting · MEETING_PASSWORD_REQUIREDIf the meeting is password-protected, the bot fires a bot.waiting event with error_code: MEETING_PASSWORD_REQUIRED and waiting_reason: password_required — distinct from a normal lobby wait. The recovery payload tells your code the host must remove the password or admit the bot directly. No silent failures.
Nobody showed up
Probot.no_showBot joins. Nobody enters the meeting. bot.no_show fires automatically — no polling, no empty transcripts to explain. Build a no-show notification to the booking host with one webhook handler.
{
"event": "bot.failed",
"bot": {
"id": "bot_01JXY...",
"status": "failed",
"error_code": "BOT_REMOVED",
"error_message": "The bot was removed from the meeting by the host."
},
"recovery": {
"action": "respawn",
"can_respawn": true,
"meeting_url": "https://meet.google.com/abc-def-ghi",
"description": "Send a new POST /v1/bots to re-join."
}
}Pricing
£0.50/ hour captured
Pay per second. No seats. No monthly minimum. $200 free credit on sign-up.
Frequently
asked
questions
No. Gregnote is a complete replacement. One API key, one invoice. We handle the meeting bot provider and STT internally. You never need separate vendor accounts.
Audio is stored in Cloudflare R2, encrypted at rest. Transcription runs through our STT pipeline (OpenAI Whisper or Deepgram depending on your model). The recording.ready webhook delivers a presigned URL — valid 24 hours for direct audio uploads, 1 hour for meeting recordings via the REST API. Transcripts are retained for 30 days.
Google Meet and Microsoft Teams are fully supported today — both tested end to end. Zoom is in active development. Sign up and we'll notify you when it lands.
Metered billing via Stripe. You're charged per second of meeting captured, rounded to the nearest second. No seat fees, no minimum. There's no monthly commitment.
We retry at 0 s, 1 m, 5 m, 30 m, and 2 h — four retries after the initial attempt — with a fresh HMAC signature on each. Every attempt is logged so you can replay any event from the dashboard.
Yes. POST /v1/bots/:id/stop ejects the bot immediately and triggers the full pipeline — transcript fetch, webhook delivery, billing — within seconds. Without this call, the bot waits up to 60 seconds of silence after all participants leave before completing automatically.
Yes. Gregnote is self-hostable on any Docker host. Contact us for an enterprise licence and deployment guide.
The API to get transcripts, recordings, and metadata from meetings.
API key in 30 seconds. $200 free credit on sign-up. No card required.
Works with
Google MeetZoom (soon)Teams