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.
| Method | Path | Description |
| GET | /me | Check the token; returns userId, name, email. |
Meetings
| Method | Path | Description |
| GET | /meetings | Upcoming scheduled meetings (not yet ended) with join links. |
| POST | /meetings | Schedule 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
| Field | Type | Notes |
title | string | Required, up to 200 characters. |
start | ISO-8601 | e.g. 2026-10-01T15:30:00+05:30. Without an offset it is read in timezone. Must be in the future. |
durationMinutes | number | 5 to 1439, default 60. |
timezone | IANA name | e.g. America/Chicago; default is your preference. |
description | string | Optional. |
invitees | string[] | Email addresses. |
aiNoteTaker | boolean | The AI Note Taker joins automatically when the first person arrives. |
webinar | boolean | Creates 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
| Method | Path | Description |
| GET | /meetings/{id}/summary | Latest AI summary: id, createdAt, content (Markdown), versions. |
| GET | /meetings/{id}/transcript | Latest transcript text, one line per utterance: [HH:MM:SS] Speaker: text. |
| GET | /meetings/{id}/action-items | actionItems[] with task, owner, due, status. |
These return 404 with a clear message until the meeting has a summary or transcript.
Attendance
| Method | Path | Description |
| GET | /meetings/{id}/attendance?day=YYYY-MM-DD | occurrences[] (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).
| Method | Path | Description |
| GET | /webhooks | Your 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}/test | Send a signed ping event now; returns the HTTP status your endpoint answered. |
Events
| Event | When | data fields |
meeting.created | Meeting scheduled on the web or via the API | id, meetingId, title (+ start from the API) |
meeting.updated | Meeting edited | id, meetingId, title |
meeting.deleted | Meeting deleted | id, meetingId, title |
meeting.ended | Host clicked "End meeting for all" (once per day) | id, meetingId, title |
summary.ready | AI summary saved | summaryId, meetingId, title, summary, actionItems[], url |
registrant.added | Someone registered for your webinar | meetingId, title, name, email, organization, role |
recording.ready | A recording finished processing | recordingId, 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
| Status | Meaning |
400 | Invalid body or field; the reason is in error. |
401 | Missing, wrong or revoked token. |
404 | Unknown path, or the meeting does not exist or is not yours. |
405 | Method not supported on that path. |
409 | Not 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.