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
| Field | Type | What it is |
|---|---|---|
data.meeting | string | The meeting code. |
data.id | string | The recording's id. |
data.url | string | Its link, meetful.com/r/<id>, which opens it with the transcript beside it. |
data.seconds | number | How 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
recordingA recording finished, with its share link.meeting.endedThe whole transcript, recap and notes when a meeting ends.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.