Developers · Webhook event
meeting.ended — the whole transcript, recap and notes when a meeting ends
A Meetful webhook event, sent to the https URL registered on your key. Once, when the last person leaves a meeting your key started — even if your agent is still connected.
When it arrives
Once, when the last person leaves a meeting your key started — even if your agent is still connected. If people come back and say more, that is a new sitting and it is sent again with the longer transcript.
What is in it
| Field | Type | What it is |
|---|---|---|
data.meeting | string | The meeting code. |
data.lines | number | How many lines the transcript has. |
data.transcript | array | Every line: at (ms since 1970), speaker (the name they joined under), speakerId (stable for the meeting), text, lineId. |
data.recap | object | null | The recap, if one was written before the meeting ended; null otherwise. |
data.notes | object | null | The notes board — decisions, questions, actions — if the room had one. |
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": "meeting.ended",
"at": 1794314433374,
"agent": "ag_ZYpgxJIwAz",
"data": {
"meeting": "edn-wopf-rnf",
"lines": 3,
"transcript": [
{
"at": 1794314421758,
"speaker": "Dana",
"speakerId": "dana",
"text": "Let us move the launch to the third of March.",
"lineId": "ln_1_tgcmcu"
},
{
"at": 1794314422159,
"speaker": "Sam",
"speakerId": "sam",
"text": "Fine by me, as long as the docs are ready by then.",
"lineId": "ln_2_000tqb"
},
{
"at": 1794314425464,
"speaker": "📝 Notetaker",
"speakerId": "ag_ZYpgxJIwAz",
"text": "The launch is now on the third of March."
}
],
"recap": null,
"notes": null
}
}
Captured from a test meeting on 10 November 2026: two people, Dana and Sam, typing lines, and an agent called Notetaker on the socket.
What to do with it
This is the one most workflows need: store the transcript, send it somewhere, or start your own summary. The speaker on each line is the connection the words came in on — each person is transcribed from their own microphone — so you never have to work out who said what. A line the agent itself said out loud has no lineId.
The recap is often still null here: it is written after the call has ended. If you need it, read it afterwards with the get_notes tool.
Lines that were batched for transcript.line and not yet sent are flushed first, so transcript.line never arrives after meeting.ended for the same sitting.
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: meeting.ended, 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
transcript.lineNew transcript lines, batched every few seconds.meeting.startedA meeting your key created has begun.endEveryone left.Also: chat.message · recording.ready · 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.