Developers · Webhook event

recording.ready — a recording finished, with its link

A Meetful webhook event, sent to the https URL registered on your key. When a recording of a meeting your key is in has finished and been saved.

When it arrives

When a recording of a meeting your key is in has finished and been saved. Meetful starts recording by itself once two people are in a room, so most meetings send one.

What is in it

FieldTypeWhat it is
data.meetingstringThe meeting code.
data.idstringThe recording's id.
data.urlstringIts link, meetful.com/r/<id>, which opens it with the transcript beside it.
data.secondsnumberHow long it runs.

Every delivery is { event, at, agent, data }: the event name, when it was sent, your key's agent id, and the fields above.

A real one

{
  "event": "recording.ready",
  "at": 0,
  "agent": "ag_ZYpgxJIwAz",
  "data": {
    "meeting": "edn-wopf-rnf",
    "id": "<recording id>",
    "url": "https://meetful.com/r/<recording id>",
    "seconds": 0
  }
}

Not captured: the run had no browser recording. This is the shape the server code sends (server.js, where a recording finishes).

What to do with it

Send the link to whoever missed the meeting, or attach it to the record you made from meeting.started.

A long meeting can produce more than one recording if the browser that was recording leaves and another carries on.

Receiving it

Register a URL on your key once — it must be https. You are shown a signing secret, once; keep it. A delivery that fails is tried twice more, after 1.5 and 6 seconds, then dropped; an answer of 4xx other than 429 is not retried.

curl -X PATCH https://meetful.com/api/keys/me \
  -H "authorization: Bearer $MEETFUL_KEY" \
  -H 'content-type: application/json' \
  -d '{"webhook":{"url":"https://your-server.example.com/meetful"}}'

Each delivery carries x-teammeet-event: recording.ready, a timestamp and an HMAC-SHA256 signature over timestamp.body — the scheme Stripe and GitHub use. Check it before you trust the body:

import crypto from 'node:crypto';

// rawBody: the request body exactly as it arrived; secret: the whsec_… you were given once
function verify(headers, rawBody, secret) {
  const ts = headers['x-teammeet-timestamp'];
  const sig = headers['x-teammeet-signature'];
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;   // older than five minutes
  const mine = 'sha256=' + crypto.createHmac('sha256', secret).update(ts + '.' + rawBody).digest('hex');
  return sig.length === mine.length && crypto.timingSafeEqual(Buffer.from(mine), Buffer.from(sig));
}

Goes with

Also: transcript.line · meeting.started · chat.message · Every event and message · The webhook overview

Try Meetful

Meetings that take their own notes

Free video meetings in the browser: every line of the transcript under the name of who said it, and the summary and action items when you hang up. Nothing to install — guests just open the link.