$200 is on us · £0.50/hr after · no card needed

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

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.

Meeting Bots provider + API key
Speech to Text provider + API key
Glue code to join the two
Webhook normalisation layer
Two-vendor billing to reconcile
One Gregnote API key

How it works

Three steps. One afternoon.

01

POST to /v1/bots

Send the meeting URL and your webhook endpoint. The bot joins within 30 seconds.

02

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.

03

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.

terminal
# Bot joins your meeting
curl -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"
}'
response.json
# Immediate response
{
"id": "bot_01JXYZ...",
"status": "joining",
"meeting_url": "https://meet.google.com/abc-def-ghi"
}
webhook payload
# 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

handled
bot.waiting

Bot 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

handled
bot.failed · BOT_ADMISSION_DENIED

If 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

handled
bot.failed · BOT_REMOVED

If 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

handled
bot.waiting · MEETING_PASSWORD_REQUIRED

If 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

Pro
bot.no_show

Bot 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.

webhook payload — bot kicked mid-meeting
{
  "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.

Unlimited bots
Unlimited STT uploads
Unlimited webhook endpoints
Speaker diarisation with real display names
recording.ready audio with presigned URL
POST /stop for instant pipeline completion
Metadata passthrough on every event
Dashboard + usage analytics
30-day transcript storage
Email support

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