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)
  • signing: none (the webhook url is the shared secret - keep it private)
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