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

FieldTypeWhat it is
data.meetingstringThe meeting code.
data.linesnumberHow many lines the transcript has.
data.transcriptarrayEvery line: at (ms since 1970), speaker (the name they joined under), speakerId (stable for the meeting), text, lineId.
data.recapobject | nullThe recap, if one was written before the meeting ended; null otherwise.
data.notesobject | nullThe 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

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.