Skip to main content
miniti can POST a meeting payload as json to any url when a meeting is saved, when insights are regenerated, or when a saved transcript is trimmed. works with zapier, make, n8n, and any custom endpoint.

configure

  1. open settings (⌘,)
  2. go to the webhooks section
  3. paste a url into webhook url
  4. leave it empty to disable
miniti sends requests directly from your device. no backend sits in the middle.

events

request

  • method: POST
  • headers: Content-Type: application/json
  • timeout: 10 seconds
  • retries: none (fire-and-forget)
  • transport: https only (v2.8.0). a plain http:// address is refused, in settings and at send time, because the payload carries the full transcript and attendee names. the one exception is http://localhost or 127.0.0.1 for a hook running on the same machine
  • signing: none (the webhook url is the shared secret - keep it private). miniti never writes the url to its debug log, only the host, since zapier, make, and n8n put the secret in the path
webhooks are unsigned. anyone with your webhook url can send payloads to it. use a hard-to-guess url path, or put a reverse proxy in front of your endpoint that checks a secret token from the url.

payload

field notes

  • meddpicc, training, questions, attendees, and speaker_names are omitted when empty - do not assume these keys are always present
  • speaker_names is a map from the underlying diarization key to the resolved real name (e.g. "jane doe"). the key is whatever miniti uses internally to identify that speaker - it is not guaranteed to be a human-readable "speaker N" string, so treat it as an opaque id and look up names by key rather than parsing it. see speaker names for how miniti resolves them.
  • transcript[].speaker is the display label for that segment: the resolved real name when one is available, otherwise the display form of the diarization label, or "you" for your own mic. do not assume it matches the speaker_names key.
  • calendar_event_id is present only if the meeting was linked to a google calendar event
  • transcript[].timestamp is seconds from the start of the recording
  • transcript_edited_at is present after a saved transcript has been trimmed
  • transcript_revision increments each time the saved transcript is edited
  • insights_stale is true when transcript edits have cleared generated insights and the meeting has not been regenerated yet
  • after transcript trimming, generated insight fields may be empty until the user regenerates insights
  • date and end_time are ISO 8601 utc
  • keys are always json-sorted - downstream consumers can rely on stable ordering

matching records in other systems

  • use meeting.id as the external id and idempotency key for the meeting. meeting.updated keeps the same id, so downstream systems can replace the existing record instead of creating a duplicate.
  • if your system groups meetings by customer or company, match against meeting.attendees[].domain. this is available when the meeting came from google calendar attendees.
  • use meeting.calendar_event_id when you need to link back to the source google calendar event.
  • action items do not have their own ids today. if your downstream system needs one row per action item, derive a stable id from meeting.id plus the action item index or a hash of the action item text.

receiver requirements

  • respond with any 2xx status - miniti logs non-2xx as failures but does not retry
  • respond within 10 seconds or miniti will time out
  • accept a payload up to ~a few mb for long meetings (transcript size dominates)

recipes

  • zapier / make / n8n - use their built-in “webhook by url” trigger and map fields from the meeting object
  • slack - forward summary + action items to a channel by transforming the payload in a small middle function
  • notion / airtable - create a row per meeting.saved event, mapping id, title, summary, action_items

see also