REST API & webhooks

Automate Enaviya Meet from your own apps, CRMs and no-code tools (Zapier, Make, n8n, Power Automate). Base URL: https://www.enaviyameet.com/api/v1

Authentication

Create a personal API token under Workspace → Calendar add-ins → Personal API token (sign in required). Send it on every request. Tokens act as you, can be revoked at any time, and are stored only as a hash.

Authorization: Bearer emk_xxxxxxxxxxxxxxxxxxxxxxxx

All responses are JSON with "ok": true or "ok": false, "error": "…". CORS is open, so the API can be called from browser add-ins.

MethodPathDescription
GET/meCheck the token; returns userId, name, email.

Meetings

MethodPathDescription
GET/meetingsUpcoming scheduled meetings (not yet ended) with join links.
POST/meetingsSchedule a one-off meeting. Invitees receive the calendar invitation email. Returns 201.
GET/meetings/{id}One of your meetings. {id} is the numeric id returned by list / create.
PATCH/meetings/{id}Change title, description, invitees. For one-off meetings also start, durationMinutes, timezone (recurring meetings return 409). Invitees are not re-notified. Clients that cannot send PATCH can use POST with X-HTTP-Method-Override: PATCH.
DELETE/meetings/{id}Cancel (delete) the meeting.

Create fields

FieldTypeNotes
titlestringRequired, up to 200 characters.
startISO-8601e.g. 2026-10-01T15:30:00+05:30. Without an offset it is read in timezone. Must be in the future.
durationMinutesnumber5 to 1439, default 60.
timezoneIANA namee.g. America/Chicago; default is your preference.
descriptionstringOptional.
inviteesstring[]Email addresses.
aiNoteTakerbooleanThe AI Note Taker joins automatically when the first person arrives.
webinarbooleanCreates a webinar with a registration page. Only on the Business plan; other plans get a 400 error.
curl -X POST https://www.enaviyameet.com/api/v1/meetings \
  -H "Authorization: Bearer emk_…" -H "Content-Type: application/json" \
  -d '{"title":"Weekly sync","start":"2026-10-01T15:30:00+05:30","durationMinutes":45,
       "timezone":"Asia/Kolkata","invitees":["a@example.com"],"aiNoteTaker":true}'

# reschedule and rename
curl -X PATCH https://www.enaviyameet.com/api/v1/meetings/1234 \
  -H "Authorization: Bearer emk_…" -H "Content-Type: application/json" \
  -d '{"title":"Weekly sync (moved)","start":"2026-10-02T10:00:00+05:30"}'

# cancel
curl -X DELETE https://www.enaviyameet.com/api/v1/meetings/1234 -H "Authorization: Bearer emk_…"

A meeting object contains id, meetingId, title, description, start, durationMinutes, timezone, recurring, invitees, aiNoteTaker, webinar, ended, password, joinUrl and hostUrl (keep the host link private).

AI summary, transcript and action items

MethodPathDescription
GET/meetings/{id}/summaryLatest AI summary: id, createdAt, content (Markdown), versions.
GET/meetings/{id}/transcriptLatest transcript text, one line per utterance: [HH:MM:SS] Speaker: text.
GET/meetings/{id}/action-itemsactionItems[] with task, owner, due, status.

These return 404 with a clear message until the meeting has a summary or transcript.

Attendance

MethodPathDescription
GET/meetings/{id}/attendance?day=YYYY-MM-DDoccurrences[] (days the meeting ran) and attendees[] for day (default: most recent) with name, email, role, joinedAt, leftAt, minutes, sessions.

Webhooks

Register an HTTPS URL and Enaviya Meet POSTs a JSON event to it. Manage hooks in Calendar add-ins → Webhooks or with the API (up to 10 per user).

MethodPathDescription
GET/webhooksYour hooks with last delivery status, plus the list of event names.
POST/webhooks{"url":"https://…","events":["summary.ready","meeting.ended"]}. Returns the signing secret once.
DELETE/webhooks/{id}Remove a hook.
POST/webhooks/{id}/testSend a signed ping event now; returns the HTTP status your endpoint answered.

Events

EventWhendata fields
meeting.createdMeeting scheduled on the web or via the APIid, meetingId, title (+ start from the API)
meeting.updatedMeeting editedid, meetingId, title
meeting.deletedMeeting deletedid, meetingId, title
meeting.endedHost clicked "End meeting for all" (once per day)id, meetingId, title
summary.readyAI summary savedsummaryId, meetingId, title, summary, actionItems[], url
registrant.addedSomeone registered for your webinarmeetingId, title, name, email, organization, role
recording.readyA recording finished processingrecordingId, meetingId, title, durationSec, watchUrl, downloadUrl
POST https://your-endpoint.example.com/hooks/enaviya
Content-Type: application/json
X-Emeet-Event: summary.ready
X-Emeet-Timestamp: 1790000000
X-Emeet-Signature: sha256=5f2c…

{"event":"summary.ready","createdAt":"2026-09-29T10:15:00Z",
 "data":{"summaryId":812,"meetingId":"12345678901","title":"Weekly sync",
         "summary":"## Executive summary …","actionItems":[{"task":"Send proposal","owner":"Priya","due":"Friday"}],
         "url":"https://www.enaviyameet.com/usermeetingnotes.et?recap=812"}}

Answer with any 2xx within 10 seconds. Network errors and 5xx answers are retried once after 5 seconds. Only public HTTPS URLs are accepted (no localhost or private network addresses).

Verify signatures

Compute HMAC-SHA256(secret, timestamp + "." + rawBody) as lowercase hex and compare it with the value after sha256=. Reject requests whose timestamp is more than 5 minutes old.

// Node.js (Express, raw body)
const crypto = require('crypto');
app.post('/hooks/enaviya', express.raw({ type: 'application/json' }), (req, res) => {
  const ts = req.get('X-Emeet-Timestamp');
  const sig = (req.get('X-Emeet-Signature') || '').replace('sha256=', '');
  const expected = crypto.createHmac('sha256', process.env.EMEET_WEBHOOK_SECRET)
    .update(ts + '.' + req.body.toString('utf8')).digest('hex');
  const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
  if (!fresh || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) return res.sendStatus(401);
  const event = JSON.parse(req.body);
  console.log(event.event, event.data);
  res.sendStatus(204);
});
# Python (Flask)
import hmac, hashlib, time
@app.post("/hooks/enaviya")
def hook():
    ts = request.headers["X-Emeet-Timestamp"]
    sig = request.headers["X-Emeet-Signature"].removeprefix("sha256=")
    expected = hmac.new(SECRET.encode(), (ts + "." + request.get_data(as_text=True)).encode(), hashlib.sha256).hexdigest()
    if abs(time.time() - int(ts)) > 300 or not hmac.compare_digest(sig, expected):
        return "", 401
    return "", 204

Errors & limits

StatusMeaning
400Invalid body or field; the reason is in error.
401Missing, wrong or revoked token.
404Unknown path, or the meeting does not exist or is not yours.
405Method not supported on that path.
409Not allowed in the current state (e.g. rescheduling a recurring meeting, webhook limit reached).

Request bodies are limited to 64 KB. Up to 10 API tokens and 10 webhooks per user. See also the trust & security page for how meeting data is stored and protected.