CRM sync
Summary, decisions and action items onto the HubSpot, Salesforce or Monday deal matched by participant domain.
v1
Everything Mesakem knows about your meetings — meetings, transcripts, summaries, decisions and tasks — is now available to your own systems: secure reads, Hebrew and English, with exactly the permissions your dashboard has. And with webhooks, Mesakem tells you the moment something changes.
https://mesakem.com/api/v1The API is REST over HTTPS with UTF-8 JSON. Every request carries a personal API key that acts as you, in one work area, and sees exactly what your dashboard shows you — never more. A meeting deleted in Mesakem answers 404 immediately.
Summary, decisions and action items onto the HubSpot, Salesforce or Monday deal matched by participant domain.
Meeting tasks into Asana, ClickUp or Jira, with assignee and due date.
Summaries as Markdown or HTML straight into Notion or Confluence.
Meeting hours per client, talk time and trends — incremental sync with updated_since.
Transcripts and summaries as the knowledge source of an internal agent.
Transcripts (VTT/SRT) and summaries into your own archive, including DOCX files.
In the dashboard open Settings → API & webhooks and press “Create key”. Name it, choose access and expiry. Open Settings
Copy the key (msk_live_…) — it is shown once only. Keep it in a secret store, never in code.
Make a first request: GET /me confirms the key works and shows its scopes.
List your latest meetings, then fetch the summary of one.
export MESAKEM_API_KEY="msk_live_…" # from Settings → API & webhooks
# 1. Check the key
curl https://mesakem.com/api/v1/me -H "Authorization: Bearer $MESAKEM_API_KEY"
# 2. Latest meetings
curl "https://mesakem.com/api/v1/meetings?limit=5" -H "Authorization: Bearer $MESAKEM_API_KEY"
# 3. A summary as Markdown
curl "https://mesakem.com/api/v1/meetings/run_…/summary?format=markdown" -H "Authorization: Bearer $MESAKEM_API_KEY"Send the key as Authorization: Bearer msk_live_…. No-code tools may send it as X-Api-Key instead. Cookies are never read. A wrong, revoked or expired key answers 401 without saying which.
Authorization: Bearer msk_live_AbC1…wxYz
X-Api-Key: msk_live_AbC1…wxYz| Scope | What it unlocks |
|---|---|
meetings:read | Meetings, one meeting, participants |
transcripts:read | Transcripts in every format |
summaries:read | Summaries and documents, including DOCX |
recordings:read | 5-minute recording links |
tasks:read | Your tasks and their checklists |
calendar:read | Upcoming meetings from your calendar |
team:read | Organization team members (owners and admins) |
webhooks:read | Your webhook endpoints, their delivery logs and the event catalog |
webhooks:write | Create, change, test, rotate, redeliver and delete endpoints (paid plans) |
settings:read | The calendar auto-join mode |
shares:read | A meeting's public link |
bot:write | Send, schedule and cancel the bot |
tasks:write | Create and update tasks and checklists |
uploads:write | Upload recordings |
settings:write | Change the auto-join mode |
meetings:write | Rename and delete meetings — only when ticked explicitly |
shares:write | Create and revoke public links — only when ticked explicitly |
rooms:read | Your rooms and shared rooms, their items, and their stored decisions and analyses |
rooms:write | Create, rename, archive, and add or remove meetings and calls |
calls:read | Your phone calls: transcript, summary and recording link |
search:read | Keyword search over meetings, tasks, rooms and people (with each type's own scope) |
templates:read | The built-in summary templates and yours |
templates:write | Create, update, archive and set the default of your templates |
Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (and X-RateLimit-*). Going over answers 429 with Retry-After in seconds.
| Per key | 60 requests / minute |
|---|---|
| Per work area | 20,000 requests / day (UTC) |
| Per IP before authentication | 120 requests / minute |
| Webhook changes per key | 20 / minute (create, update, delete, rotate, test, redeliver) |
| Bot send and schedule, per user | 10 / minute · 60 / hour · 200 / day |
| Bot send and schedule, per work area | 20 / minute · 120 / hour · 300 / day |
| Uploads, per user | 10 / minute, and at most 3 in progress |
HTTP/1.1 429 Too Many Requests
Retry-After: 21
RateLimit-Limit: 60
RateLimit-Remaining: 0
RateLimit-Reset: 21
X-Request-Id: apireq_mfa1b2c3XyZ0aBcDeFgHiJWebhooks call you the moment a summary is ready — no wasted requests. See the Webhooks chapter.
If you must poll: GET /meetings?updated_since=… at most every 5 minutes, and keep the last updated_at you saw.
Send the last ETag as If-None-Match. For transcripts and summaries only the version is checked and a body-less 304 comes back — almost free.
On 429 or 5xx wait for Retry-After and add jittered exponential backoff.
# Only what changed since your last sync, oldest change first
curl "https://mesakem.com/api/v1/meetings?updated_since=2026-10-17T08:00:00Z" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H 'If-None-Match: "c-…"' # → 304 Not Modified when nothing changedLists return { data, next_cursor, has_more }. Send limit (1–100, default 25) and the cursor from the previous page. Cursors are opaque and signed: they belong to the key, the work area and the request's filters, and changing any of them answers 400 invalid_cursor.
# First page
curl "https://mesakem.com/api/v1/meetings?limit=100" -H "Authorization: Bearer $MESAKEM_API_KEY"
# Next page: pass next_cursor back unchanged, with the SAME filters
curl "https://mesakem.com/api/v1/meetings?limit=100&cursor=<next_cursor>" -H "Authorization: Bearer $MESAKEM_API_KEY"Every error has the same, stable shape. code is stable; message follows Accept-Language (Hebrew or English); request_id helps us find the request.
{
"error": {
"code": "insufficient_scope",
"message": "The key is missing a required scope.",
"details": [{ "field": "scope", "message": "Requires transcripts:read." }],
"request_id": "apireq_mfa1b2c3XyZ0aBcDeFgHiJ"
}
}| HTTP | code | Meaning |
|---|---|---|
400 | bad_request | Invalid, unknown or repeated parameter |
400 | invalid_cursor | Cursor from another key, route or filter set |
401 | unauthorized | Missing, malformed, unknown, revoked or expired key |
403 | insufficient_scope | The key lacks the scope (details names it) |
403 | plan_required | The plan does not include this part |
404 | not_found | Missing or not accessible to you — never says which |
413 | payload_too_large | Response too large; lower limit or page |
429 | rate_limited | Over a limit; see Retry-After |
500 | internal_error | Something failed on our side |
403 | quota_exceeded | The plan's meeting quota does not allow it (see reason) |
409 | meeting_bot_already_active | A bot is already in the meeting; meeting_id is that meeting |
409 | idempotency_key_reused | The same Idempotency-Key with a different request |
409 | idempotency_in_progress | The first request with that key is still running |
409 | conflict | Conflicts with the current state (see reason, e.g. calendar_event_control_locked) |
415 | unsupported_media_type | Unsupported content or file type |
422 | unsupported_recipient | Sharing with a user or team — only a public link is supported |
422 | unprocessable | Valid, but cannot be carried out (see reason) |
On paid plans a key can also act: send the bot to a meeting, schedule or cancel it, decide when it joins on its own, manage tasks, upload recordings and share a meeting by link. Every write runs the same code and checks as the dashboard, and is recorded in the audit log.
When a meeting is booked, send the bot with start_time and an Idempotency-Key from the booking id. When the summary is ready you get a webhook; then fetch the summary.
# A meeting was booked: send Mesakem to it, at its start time.
curl -X POST "https://mesakem.com/api/v1/meetings/bot" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: booking-48213" \
-d '{"meeting_url":"https://zoom.us/j/1234567890?pwd=abc123","title":"Discovery call — Acme","start_time":"2026-10-20T07:00:00Z"}'
# 202 → {"meeting_id":"run_…","status":"scheduling"}
# 409 meeting_bot_already_active → error.meeting_id is the meeting that already has the bot{
"error": {
"code": "plan_required",
"message": "Your plan does not include this part of the API.",
"details": [
{ "field": "scope", "message": "bot:write is not included in this plan." },
{ "field": "plan", "message": "The trial includes read-only API access. Upgrade to Pro for writes: https://mesakem.com/dashboard/billing/pro?cycle=annual" }
],
"request_id": "apireq_mfa1b2c3XyZ0aBcDeFgHiJ",
"upgrade_url": "https://mesakem.com/dashboard/billing/pro?cycle=annual"
}
}Webhooks turn the direction around: instead of your system asking the API every few minutes whether anything changed, Mesakem sends it a signed POST the moment something happens — a summary is ready, a task was created, a meeting was deleted. You hear about it at once, with no wasted requests and nothing missed between two polls.
The event leaves moments after the change is saved — not at your next poll.
Every delivery is signed with Standard Webhooks and carries only ids, status and counts. You fetch the details with the API, under your key's permissions.
A failed delivery is retried — up to 9 attempts over about 45 hours — with a delivery log and redeliver.
Each endpoint gets only the events you picked, narrowed further by meeting source and by room.
data.links.api, when you need themCreate an endpoint: in Settings → API & webhooks, or with POST /webhooks and a key that has webhooks:write (paid plans). Open Settings
Pick the events you want. Two events also have an alternate name, which you can subscribe with too.
Copy the signing secret (whsec_…). It is shown once only; keep it in a secret store.
Send a test event (webhook.test) from Settings or with POST /webhooks/{endpoint_id}/test. The answer shows your status code, the latency and the start of your response.
Verify the signature on every request and answer 2xx within 10 seconds.
# 1. Create the endpoint (a key with webhooks:write — or use Settings → API & webhooks)
curl -X POST "https://mesakem.com/api/v1/webhooks" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.example.com/mesakem",
"events": ["summary.ready", "action_items.created", "meeting.deleted"],
"description": "CRM sync"
}'
# → 201 Created. Store "secret" (whsec_…) now: it is never shown again.
# 2. Send webhook.test and see what your endpoint answered
curl -X POST "https://mesakem.com/api/v1/webhooks/whk_…/test" \
-H "Authorization: Bearer $MESAKEM_API_KEY"
# → { "delivered": true, "status": 200, "latency_ms": 162, … }On the trial: one endpoint, managed in Settings. Managing endpoints with the API (webhooks:write) comes with paid plans.
24 event types, plus webhook.test, which is sent only when you ask for a test. Each endpoint subscribes to its own list, and filters (meeting sources and rooms) narrow it further. The same list is available from GET /webhook-event-types.
Alternate names: subscribe with an alternate name and the delivery's type is that name. Subscribe with both names and you get one delivery, labelled with the main name.
| Event | When it fires | data fields |
|---|---|---|
| Meetings | ||
meeting.scheduled | A meeting was scheduled for the notetaker (calendar, link or manual). | object: "meeting"meeting_idsourcescheduled_start_timetitle |
meeting.bot_status_changed | The notetaker is joining, waiting in the lobby, was not admitted or was removed. | object: "meeting"meeting_idbot_statusprevious_status |
meeting.started | Recording started. | object: "meeting"meeting_idstart_time |
meeting.ended | The meeting ended and processing began. | object: "meeting"meeting_idend_timeduration_seconds |
meeting.failed | The meeting ended without a recording (failed, cancelled or not admitted). | object: "meeting"meeting_idstatusfailure_category |
meeting.deleted | A meeting was deleted. Delete your copy too. | object: "meeting"meeting_id |
| Recordings, transcripts & summaries | ||
recording.ready | The recording is stored and can be fetched. | object: "recording"meeting_idrecording_idduration_seconds |
transcript.readyalternate namemeeting.transcript_ready | A transcript is ready. | object: "transcript"meeting_idtranscript_idlanguagesegment_count |
summary.readyalternate namemeeting.initial_summary_ready | The first summary of a meeting is ready. | object: "summary"meeting_idsummary_iddocument_idslanguagecounts |
summary.updated | A summary was regenerated or edited. | object: "summary"meeting_idsummary_idedited |
action_items.created | Action items from a meeting or call were added to tasks. | object: "action_items"meeting_idtask_idscount |
| Phone calls | ||
call.transcript_ready | A phone call transcript is ready. | object: "call"call_idmeeting_idtranscript_id |
call.summarized | A phone call was summarized. | object: "call"call_idmeeting_idsummary_id |
| Tasks | ||
task.created | A task was created. | object: "task"task_idstatus |
task.updated | A task changed (title, status, due date or items). | object: "task"task_idstatuschanged |
task.deleted | A task was deleted. | object: "task"task_id |
| Public links | ||
share.created | A public link to a meeting or room was created. | object: "share"share_idresource |
share.revoked | A public link was turned off. | object: "share"share_idresource |
| Rooms | ||
room.created | A room was created. | object: "room"room_id |
room.updated | A room was renamed or its settings changed. | object: "room"room_id |
room.archived | A room was archived. | object: "room"room_id |
room.meeting_added | A meeting was added to a room. | object: "room"room_idmeeting_id |
room.meeting_removed | A meeting was removed from a room. | object: "room"room_idmeeting_id |
| Uploads | ||
upload.failed | An uploaded recording could not be processed. | object: "upload"upload_idreason |
| System | ||
webhook.testtest only | A test event, sent only from Settings or the test endpoint. | object: "webhook"endpoint_id |
Meeting and task events also carry data.links.api and data.links.app.
Every delivery is a POST with a UTF-8 JSON body. The envelope is the same for every event; only data changes. The payload is thin on purpose: ids, status and counts — no transcript or summary text, no e-mail addresses, no share links.
POST /mesakem HTTP/1.1
Host: hooks.example.com
Content-Type: application/json
User-Agent: Mesakem-Webhooks/1.0
webhook-id: msg_1a2b3c4d5e6f708192a3b4c5d6e7f809
webhook-timestamp: 1792317141
webhook-signature: v1,hPEWJKsYRZkotC6qTrqona6rJhYw7hL1L0LA3CTlWD8=
{
"id": "msg_1a2b3c4d5e6f708192a3b4c5d6e7f809",
"type": "summary.ready",
"api_version": "2026-10",
"created_at": "2026-10-18T09:52:20.000Z",
"workspace_id": "workspace_1a2b3c4d",
"data": {
"object": "summary",
"meeting_id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"summary_id": "summary_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e",
"document_ids": [
"doc_sum_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e",
"doc_act_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e",
"doc_dec_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e"
],
"language": "he",
"counts": { "action_items": 5, "decisions": 2 },
"links": {
"api": "https://mesakem.com/api/v1/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b/summary",
"app": "https://mesakem.com/dashboard/meeting/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b"
}
}
}| Field | Meaning |
|---|---|
id | The message id, equal to the webhook-id header. The same across retries and redeliveries. |
type | The event name, or its alternate name if you subscribed with that. |
api_version | The payload version: 2026-10. |
created_at | When the event happened (ISO 8601, UTC). Order by it, not by arrival. |
workspace_id | The event's work area. |
data.object | The resource kind: meeting, summary, task… |
data.links | api — the API URL for the full details; app — the page in the dashboard. |
| Header | Meaning |
|---|---|
webhook-id | msg_… — your dedupe key |
webhook-timestamp | Unix seconds of this attempt |
webhook-signature | v1,<base64> — two, space separated, during a secret rotation |
Content-Type | application/json |
User-Agent | Mesakem-Webhooks/1.0 |
X-Webhook-Signature | sha256=<hex> — only with the simple signature (simple_hmac) |
Every delivery is signed with Standard Webhooks — the standard Svix and others use — so a ready-made library works. Without one, these are the steps:
Take the raw body exactly as received — before any JSON parsing.
Reject a request whose webhook-timestamp is more than 5 minutes away from your clock (replay protection).
Compute HMAC-SHA256 over <webhook-id>.<webhook-timestamp>.<body> keyed with the base64-decoded secret (without whsec_), and base64 the result.
Compare, in constant time, with each v1,… value in webhook-signature. One match is enough.
import express from "express";
import { Webhook } from "standardwebhooks"; // npm i standardwebhooks
const wh = new Webhook(process.env.MESAKEM_WEBHOOK_SECRET); // whsec_…
const app = express();
// express.raw: verify the body exactly as sent, BEFORE any JSON parsing
app.post("/mesakem/webhook", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers); // signature + 5-minute window
} catch {
return res.status(400).end();
}
if (await seen(req.headers["webhook-id"])) return res.status(204).end(); // at least once: dedupe
await queue.add(event); // answer fast, work later
res.status(204).end();
});Rotating (in Settings or with POST /webhooks/{endpoint_id}/rotate-secret) returns a new secret that signs at once. For 24 hours every delivery carries two signatures — the new one, then the old — so code that checks each signature keeps working until you deploy the new secret.
For a receiver that cannot verify Standard Webhooks: an endpoint set to signature_format: "simple_hmac" also gets X-Webhook-Signature: sha256=<hex> — HMAC-SHA256 of the body alone, keyed with the full secret string (whsec_ included). This header has no timestamp and no rotation overlap, so move to the standard check when you can.
import { createHmac, timingSafeEqual } from "node:crypto";
// Only for endpoints with signature_format "simple_hmac":
// X-Webhook-Signature: sha256=<hex HMAC-SHA256 of the raw body, keyed with the FULL secret string>
export function verifySimpleHmac(rawBody, headers, secret = process.env.MESAKEM_WEBHOOK_SECRET) {
const expected = Buffer.from(`sha256=${createHmac("sha256", secret).update(rawBody).digest("hex")}`);
const given = Buffer.from(String(headers["x-webhook-signature"] ?? ""));
return given.length === expected.length && timingSafeEqual(given, expected);
}Check your code against these values (the body is the exact bytes, on one line). The timestamp is old, so switch off the 5-minute check for this run or pass your own clock.
{
"secret": "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw",
"webhook-id": "msg_0f1e2d3c4b5a69788796a5b4c3d2e1f0",
"webhook-timestamp": "1792314000",
"body": "{\"id\":\"msg_0f1e2d3c4b5a69788796a5b4c3d2e1f0\",\"type\":\"webhook.test\",\"api_version\":\"2026-10\",\"created_at\":\"2026-10-18T09:00:00.000Z\",\"workspace_id\":\"workspace_1a2b3c4d\",\"data\":{\"object\":\"webhook\",\"endpoint_id\":\"whk_3c2b1a0f9e8d7c6b5a493827161504f3\"}}",
"webhook-signature": "v1,BTWmnJ208A8o6942h9e4GevByejb0CwCw/lva2zO6jM=",
"X-Webhook-Signature": "sha256=42538b7323812ccd84b1dba444c3dfe2f769ecda320fa7d7e8fdbebf0e2cf1e2"
}A 2xx answer within 10 seconds is a success. Anything else is a failed attempt, and your answer decides whether we try again:
| Your answer | What happens |
|---|---|
2xx | Success (when it arrives within 10 seconds). |
5xx · 408 · timeout · network | Retried on the schedule. |
429 · 503 + Retry-After | Retried, waiting at least Retry-After (up to 1 hour). |
410 Gone | The endpoint is disabled at once and its pending deliveries are cancelled. |
3xx | Failed, not retried — redirects are not followed. Use the final URL. |
4xx | Any other 4xx: failed, not retried. You can redeliver it from the log. |
| Attempt | When |
|---|---|
| 1 | Immediately |
| 2 | 10 s after the previous one |
| 3 | 1 min after the previous one |
| 4 | 5 min after the previous one |
| 5 | 30 min after the previous one |
| 6 | 2 h after the previous one |
| 7 | 6 h after the previous one |
| 8 | 12 h after the previous one |
| 9 | 24 h after the previous one |
Each wait has ±10% random jitter. After attempt 9 (about 45 hours) the delivery stays failed in the log, and you can redeliver it from there.
An endpoint that fails 50 times in a row, over at least 3 days, is disabled automatically and its owner gets an e-mail. Once fixed, re-enable it in Settings or with PATCH and enabled: true — the failure count resets.
Every event arrives at least once, sometimes more (say you answered 2xx but the connection dropped). Order is not guaranteed: a retry of an older event can land after a newer one.
Every delivery is kept for 30 days with its state, attempt count, last status code, latency and the first 512 bytes of your answer. See it in Settings or with GET /webhooks/{endpoint_id}/deliveries, newest first.
Redeliver (POST …/deliveries/{delivery_id}/redeliver, answers 202) starts a new attempt series for a finished delivery — with the same webhook-id, so your dedupe recognises it.
# The last 30 days, newest first
curl "https://mesakem.com/api/v1/webhooks/whk_…/deliveries?limit=25" \
-H "Authorization: Bearer $MESAKEM_API_KEY"
# Send a finished delivery again — same webhook-id — answers 202 Accepted
curl -X POST "https://mesakem.com/api/v1/webhooks/whk_…/deliveries/whd_…/redeliver" \
-H "Authorization: Bearer $MESAKEM_API_KEY"| State | Meaning |
|---|---|
pending | Waiting for its first attempt |
delivering | Being sent now |
retry_scheduled | Failed; the next try is at next_attempt_at |
succeeded | Got a 2xx answer |
failed | Out of attempts, or an answer we do not retry — you can redeliver |
cancelled | Cancelled, for example because the endpoint was disabled or access to the meeting ended |
Verify the signature, put the event on a queue and answer 2xx right away. Anything slower than 10 seconds counts as a failure and is sent again.
webhook-idDelivery is at least once. Keep webhook-id for a few days and skip ids you have seen — retries and redeliveries reuse it.
created_atEvents can arrive out of order. Compare created_at (or the resource's updated_at from the API) instead of trusting arrival order.
data.links.apiPayloads are thin on purpose. Fetch the summary, transcript or task from the link with your API key — you always get the current version, under current permissions.
On meeting.deleted and task.deleted, delete what you stored. A deleted meeting answers 404 in the API at once.
410 when you are doneA retired receiver can answer 410 — the endpoint is disabled at once and we stop trying.
3xx) are never followed. Register the final URL.| Trial | Pro & organizations | |
|---|---|---|
| Webhook endpoints | 1 | Up to 10 per person |
| Managing endpoints | In Settings | In Settings and with the API (webhooks:write) |
Reading endpoints and logs with the API (webhooks:read) | Included | Included |
| Every event, signing, retries and the delivery log | Included | Included |
The Mesakem integration for Zapier runs on these same webhooks: instant triggers such as “New Summary” and “New Action Item”, plus Find Meeting and Find Task, connected to the tools you already use without a line of code. It is private: anyone with the invite link can add it to their Zapier account.
Open the invite link and add Mesakem to your Zapier account.
Create an API key in Mesakem Settings. Triggers need the webhooks:write permission (Manage webhooks), on a paid plan.
In Zapier, pick Mesakem, paste the key and build a Zap. Turning it on creates one webhook endpoint for it; turning it off deletes it.
A Mesakem community node for self-hosted n8n: an instant trigger on these same webhooks, plus actions on the API. The package is published on npm with provenance, and its source is on GitHub.
In n8n, open Settings → Community Nodes → Install.
Enter the package name n8n-nodes-mesakem and install.
Create an API key in Mesakem Settings, then add a Mesakem API credential in n8n and paste the key.
n8n-nodes-mesakem| Part | What it does |
|---|---|
Trigger · Mesakem Trigger | Starts a workflow the moment something happens in Mesakem: a summary is ready, a meeting ended, a transcript is ready, a task was created or changed, and more, from all 24 event types. Details are fetched by id, in at most two API requests. |
Meetings · Meeting | Get, Get Many, Get Summary, Get Transcript, Get Upcoming |
Tasks · Task | Get, Get Many, Create, Update, Delete |
The bot · Notetaker | Send, Schedule, Cancel: send it to a meeting link, schedule it for a calendar meeting, or cancel it |
Documents · Document | Get: the document as Markdown, HTML, text or JSON |
Your account · Account | Get: the key, its user, plan, permissions and limits |
You need a Mesakem API key. Triggers need a paid plan: the node registers its own webhook, which takes webhooks:write. To receive events, your n8n needs a public https address.
A room gathers every meeting and call of one client or project. The API shows exactly the rooms your dashboard shows: your own and the work area's shared rooms. Another member's private room never appears, and a room never reveals a meeting or call you cannot read directly.
DELETE /rooms/{id} archives, and PATCH with archived: false restores. The meetings themselves are untouched.GET /rooms/{id}/insights returns only what already exists: the decisions on each meeting's summary, and analyses made in the dashboard. The call never creates a new one.curl -X POST "https://mesakem.com/api/v1/rooms" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"name": "Acme pilot", "client_name": "Acme"}'
curl -X PUT "https://mesakem.com/api/v1/rooms/$ROOM_ID/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b" \
-H "Authorization: Bearer $MESAKEM_API_KEY"Calls recorded from the phone system you connected, with their transcript, summary and a 5-minute recording link. You see only your own calls, and a deleted call (or one whose meeting was deleted) is never returned.
call_. A call that produced a meeting also appears in GET /meetings (source phone), and meeting_id links the two.curl "https://mesakem.com/api/v1/calls?limit=25" \
-H "Authorization: Bearer $MESAKEM_API_KEY"
curl "https://mesakem.com/api/v1/calls/$CALL_ID/summary?format=markdown" \
-H "Authorization: Bearer $MESAKEM_API_KEY"Keyword search over your own data: meeting titles and summaries, task titles and notes, room names and meeting invitees. Every word must appear (for meetings, the start of a word is enough), and case, punctuation and Hebrew niqqud are ignored.
GET /search?q= returns meetings, tasks, rooms and people together, most relevant first. types= narrows it.GET /meetings?q= and GET /tasks?q=.tasks:read, rooms rooms:read. Search never returns an id you cannot read directly.curl "https://mesakem.com/api/v1/search?q=%D7%94%D7%A6%D7%A2%D7%AA%20%D7%9E%D7%97%D7%99%D7%A8&types=meeting,task" \
-H "Authorization: Bearer $MESAKEM_API_KEY"A template decides how Mesakem writes a summary: structure, tone, emphasis and sections. The API returns the built-in templates and yours, and lets you create, update, archive and set the default, exactly like the Templates page in the dashboard.
Ask any AI assistant you work with to draft a template, then send the result to POST /templates. Mesakem runs no AI on it: it is checked only against the rules above and stored as is. An example request to the assistant:
Draft a Mesakem summary template for discovery calls with new customers. Return JSON with two fields: name (up to 120 characters) and instructions (clear instructions, up to 12,000 characters). In the instructions: what to summarize, which sections (needs, objections, budget, next steps with owner and date), a businesslike tone and at most one page.curl -X POST "https://mesakem.com/api/v1/templates" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"type": "meeting", "name": "Discovery call", "instructions": "Summarize as a discovery call: needs, objections, budget, next steps with owner and date."}'Generated from the OpenAPI 3.1 document: reads (GET) and writes (POST, PUT, PATCH, DELETE). Every write names the scope it needs.
/meany keyCosts one database statement. Use it to check a key.
curl "https://mesakem.com/api/v1/me" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "api_key_context",
"key": {
"id": "key_3f2a9c0d4b5e6f708192a3b4c5d6e7f8",
"name": "HubSpot sync",
"display": "msk_live_AbC1…wxYz",
"scopes": [
"meetings:read",
"summaries:read"
],
"created_at": "2026-10-17T08:00:00.000Z",
"expires_at": "2027-10-17T08:00:00.000Z"
},
"user": {
"id": "user_9b8c7d6e",
"name": "Dana Levi",
"email": "dana@acme.co.il"
},
"workspace": {
"id": "workspace_1a2b3c4d",
"kind": "personal",
"plan": "full",
"organization": null
},
"limits": {
"requests_per_minute": 60,
"requests_per_day": 20000
}
}/meetingsmeetings:readNewest first by default. For incremental sync pass updated_since: results are then in ascending updated_at order; keep the last updated_at you saw and send If-None-Match. Prefer this (at most every 5 minutes) over re-reading everything.
| Parameters | Type | Notes |
|---|---|---|
limit | integer (1–100) | default 25 |
cursor | string | next_cursor from the previous page of the SAME request (same key and filters). |
status | completed | processing | scheduled | failed | |
from | date-time | ISO 8601 with offset, or YYYY-MM-DD (00:00 UTC). |
to | date-time | |
updated_since | date-time | |
order | recent | updated | |
expand | string | Comma-separated: participants, documents. |
q | string | Keyword search: every word must match (prefix match for meetings). Needs search:read. |
curl "https://mesakem.com/api/v1/meetings?limit=25&updated_since=2026-10-01T00%3A00%3A00Z" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"data": [
{
"id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"object": "meeting",
"title": "פגישת היכרות — אקמה",
"status": "completed",
"status_detail": "summarized",
"source": "zoom",
"kind": "live_meeting",
"language": "he",
"start_time": "2026-10-15T09:00:12.000Z",
"end_time": "2026-10-15T09:47:40.000Z",
"duration": 2848,
"scheduled_start_time": "2026-10-15T09:00:00.000Z",
"scheduled_end_time": "2026-10-15T10:00:00.000Z",
"has_transcript": true,
"has_recording": true,
"has_summary": true,
"summary_id": "summary_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e",
"created_by_you": true,
"app_url": "https://mesakem.com/dashboard/meeting/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"participants": [
{
"name": "Dana Levi",
"email": "dana@acme.co.il",
"company": "acme.co.il",
"organizer": true
}
],
"created_at": "2026-10-15T08:58:01.000Z",
"updated_at": "2026-10-15T09:52:18.000Z"
}
],
"next_cursor": "eyJ2IjoxLCJwIjp7InMiOiIyMDI2LTEwLTE1VDA5OjAwOjEyLjAwMDAwMFoifX0.Xn3k2l1PqR8sT6uV0wYz4aBcDeFgHiJk",
"has_more": true
}/meetings/upcomingcalendar:readDefault window: the next 336 hours (14 days). within_hours up to 8760.
| Parameters | Type | Notes |
|---|---|---|
limit | integer (1–100) | default 25 |
cursor | string | next_cursor from the previous page of the SAME request (same key and filters). |
within_hours | integer (1–8760) | default 336 |
from | date-time | ISO 8601 with offset, or YYYY-MM-DD (00:00 UTC). |
to | date-time |
curl "https://mesakem.com/api/v1/meetings/upcoming?within_hours=48" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"data": [
{
"id": "cal_evt_Qm9pZ2h0LXNlcmllcy0x",
"object": "upcoming_meeting",
"title": "סנכרון שבועי",
"start_time": "2026-10-18T07:00:00.000Z",
"end_time": "2026-10-18T07:30:00.000Z",
"meeting_url": "https://zoom.us/j/1234567890",
"source": "zoom",
"organizer": {
"email": "dana@acme.co.il"
},
"bot": {
"decision": "will_join",
"override": null,
"reason": "calendar_auto_record"
},
"series_id": "8d7c6b5a",
"created_at": "2026-10-10T12:00:00.000Z",
"updated_at": "2026-10-16T12:00:00.000Z"
}
],
"next_cursor": null,
"has_more": false
}/meetings/{meeting_id}meetings:read| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
expand | string | Comma-separated: participants, documents. |
curl "https://mesakem.com/api/v1/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"object": "meeting",
"title": "פגישת היכרות — אקמה",
"status": "completed",
"status_detail": "summarized",
"source": "zoom",
"kind": "live_meeting",
"language": "he",
"start_time": "2026-10-15T09:00:12.000Z",
"end_time": "2026-10-15T09:47:40.000Z",
"duration": 2848,
"scheduled_start_time": "2026-10-15T09:00:00.000Z",
"scheduled_end_time": "2026-10-15T10:00:00.000Z",
"has_transcript": true,
"has_recording": true,
"has_summary": true,
"summary_id": "summary_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e",
"created_by_you": true,
"app_url": "https://mesakem.com/dashboard/meeting/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"participants": [
{
"name": "Dana Levi",
"email": "dana@acme.co.il",
"company": "acme.co.il",
"organizer": true
}
],
"created_at": "2026-10-15T08:58:01.000Z",
"updated_at": "2026-10-15T09:52:18.000Z"
}/meetings/{meeting_id}meetings:writeNeeds meetings:write, which no preset includes: tick it explicitly. Only the meeting's owner.
| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
| Field | Type | Notes |
|---|---|---|
title · required | string | null | null or "" restores the original title.up to 180 characters |
curl -X PATCH "https://mesakem.com/api/v1/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"title": "Discovery call — Acme (renamed)"
}'{
"id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"object": "meeting",
"title": "פגישת היכרות — אקמה (מעודכן)",
"status": "completed"
}/meetings/{meeting_id}→ 204 No Contentmeetings:writePermanent for you, as in the dashboard (there is no restore). Needs meetings:write, which no preset includes. A meeting with a bot in it answers 409 meeting_in_progress: DELETE /meetings/{id}/bot first.
| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
curl -X DELETE "https://mesakem.com/api/v1/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b" \
-H "Authorization: Bearer $MESAKEM_API_KEY"/meetings/{meeting_id}/participantsmeetings:read| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
curl "https://mesakem.com/api/v1/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b/participants" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "participants",
"meeting_id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"invitees": [
{
"name": "Dana Levi",
"email": "dana@acme.co.il",
"organizer": true,
"company": "acme.co.il"
}
],
"speakers": [
{
"id": "spk_1",
"name": "Dana Levi"
},
{
"id": "spk_2",
"name": "דובר 1"
}
],
"attendance_available": false,
"attendance": null
}/meetings/{meeting_id}/transcripttranscripts:readformat=json pages by segment (limit ≤ 2000, ≈512 KB per page). Text formats return the whole transcript. Supports If-None-Match → 304 with a version probe.
| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
format | json | text | vtt | srt | |
limit | integer (1–100) | default 25 |
cursor | string | next_cursor from the previous page of the SAME request (same key and filters). |
curl "https://mesakem.com/api/v1/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b/transcript?format=json&limit=500" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "transcript",
"meeting_id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"transcript_id": "transcript_7e6d5c4b-3a29-4180-9f8e-7d6c5b4a3928",
"language": "he",
"mode": "segments",
"total_segments": 412,
"speakers": [
{
"id": "spk_1",
"name": "Dana Levi"
},
{
"id": "spk_2",
"name": "דובר 1"
}
],
"segments": [
{
"index": 0,
"speaker_id": "spk_1",
"start_time": 0.84,
"end_time": 6.2,
"text": "בוקר טוב, תודה שהצטרפתם."
},
{
"index": 1,
"speaker_id": "spk_2",
"start_time": 6.4,
"end_time": 11.03,
"text": "שמחים להיות כאן."
}
],
"next_cursor": "eyJ2IjoxLCJwIjp7ImEiOjIsInQiOiJ0cmFuc2NyaXB0In19.Qz8xWv7uT6sR5qP4oN3mL2kJ1iH0gF9e",
"has_more": true,
"created_at": "2026-10-15T09:49:02.000Z"
}/meetings/{meeting_id}/summarysummaries:readSupports If-None-Match → 304 with a version probe.
| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
format | json | markdown | html | text | docx |
curl "https://mesakem.com/api/v1/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b/summary?format=markdown" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "summary",
"id": "summary_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e",
"meeting_id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"language": "he",
"template": {
"id": "system_detailed_mesakem",
"name": "מפורט"
},
"title": "פגישת היכרות — אקמה",
"overview": "סקרנו את הצרכים של אקמה ואת לוחות הזמנים.",
"sections": [
{
"kind": "topic",
"title": "תמחור",
"body_markdown": "הוסכם לשלוח הצעה עד יום ראשון."
}
],
"action_items": [
{
"text": "לשלוח הצעת מחיר לאקמה"
}
],
"decisions": [
{
"text": "פיילוט של חודש"
}
],
"open_questions": [
"מי מאשר את התקציב?"
],
"citations": null,
"body_markdown": "## תקציר\nסקרנו את הצרכים של אקמה…",
"body_oversized": false,
"meeting_description": null,
"edited": false,
"structured_stale": false,
"structured_oversized": false,
"documents": [
{
"id": "doc_sum_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e",
"kind": "summary"
}
],
"created_at": "2026-10-15T09:52:18.000Z",
"updated_at": "2026-10-15T09:52:18.000Z"
}/meetings/{meeting_id}/recordingrecordings:readThe link re-checks the key when followed and then redirects to a short-lived storage URL.
| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
curl "https://mesakem.com/api/v1/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b/recording" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "recording_link",
"meeting_id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"recording_id": "recording_0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"status": "ready",
"recording_url": "https://mesakem.com/api/v1/r/Zm9yLWV4YW1wbGUtb25seQ",
"expires_at": "2026-10-17T08:05:00.000Z",
"format": "mp4",
"duration": 2848,
"created_at": "2026-10-15T09:48:30.000Z"
}/meetings/upload→ 201 Createduploads:writeThe file is the request body; title and language go in the query.
| Parameters | Type | Notes |
|---|---|---|
title | string | |
language | string | Conversation language, e.g. he, en, auto. |
summary_language | he | en | |
category | meeting | call | default meeting |
filename | string | Needed for video/quicktime; otherwise derived from Content-Type. |
Request body: the file itself. The audio or video file itself, at most 4 MB. Larger files: POST /uploads.
curl -X PUT "https://mesakem.com/api/v1/meetings/upload?title=Support+call&language=he" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: audio/mp4" \
--data-binary @call.m4a{
"object": "upload",
"id": "recjob_8a1b2c3d4e5f60718293a4b5c6d7e8f9",
"meeting_id": "run_upload_8a1b2c3d4e5f60718293a4b5c6d7e8f9",
"filename": "call.m4a",
"content_type": "audio/mp4",
"size_bytes": 3145728,
"app_url": "https://mesakem.com/dashboard/meeting/run_upload_8a1b2c3d4e5f60718293a4b5c6d7e8f9",
"created_at": "2026-10-18T09:00:00.000Z",
"status": "processing",
"upload_id": "recjob_8a1b2c3d4e5f60718293a4b5c6d7e8f9"
}/meetings/{meeting_id}/permissionsshares:readMesakem shares by public link only: the list holds perm_anyone or nothing.
| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
curl "https://mesakem.com/api/v1/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b/permissions" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"data": [
{
"id": "perm_anyone",
"object": "permission",
"recipient": {
"type": "anyone"
},
"role": "read",
"status": "ready",
"share_url": "https://mesakem.com/s#Zm9yLWV4YW1wbGU",
"created_at": "2026-10-18T09:00:00.000Z"
}
],
"share_url": "https://mesakem.com/s#Zm9yLWV4YW1wbGU",
"next_cursor": null,
"has_more": false
}/meetings/{meeting_id}/permissions→ 201 Createdshares:writerecipient {"type":"anyone"}, role read. user and team recipients answer 422 unsupported_recipient: members' meetings stay private.
| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
| Field | Type | Notes |
|---|---|---|
recipient · required | object | Only anyone (a public, read-only link). user and team recipients answer 422 unsupported_recipient. |
role | "read" |
curl -X POST "https://mesakem.com/api/v1/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b/permissions" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"recipient": {
"type": "anyone"
},
"role": "read"
}'{
"id": "perm_anyone",
"object": "permission",
"recipient": {
"type": "anyone"
},
"role": "read",
"status": "ready",
"share_url": "https://mesakem.com/s#Zm9yLWV4YW1wbGU",
"created_at": "2026-10-18T09:00:00.000Z"
}/meetings/{meeting_id}/permissions/{permission_id}→ 204 No Contentshares:writepermission_id is perm_anyone. Idempotent.
| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
permission_id · required | string | in path |
curl -X DELETE "https://mesakem.com/api/v1/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b/permissions/perm_anyone" \
-H "Authorization: Bearer $MESAKEM_API_KEY"/documents/{document_id}summaries:readIds: doc_sum_… (summary), doc_act_… (action items), doc_dec_… (decisions). docx content is base64.
| Parameters | Type | Notes |
|---|---|---|
document_id · required | string | in path |
format | json | markdown | html | text | raw | docx |
curl "https://mesakem.com/api/v1/documents/doc_sum_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e?format=markdown" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"id": "doc_act_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e",
"object": "document",
"kind": "action_items",
"meeting_id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"title": "משימות",
"format": "markdown",
"language": "he",
"content": "# משימות\n\n- לשלוח הצעת מחיר לאקמה\n",
"created_at": "2026-10-15T09:52:18.000Z",
"updated_at": "2026-10-15T09:52:18.000Z"
}/taskstasks:read| Parameters | Type | Notes |
|---|---|---|
limit | integer (1–100) | default 25 |
cursor | string | next_cursor from the previous page of the SAME request (same key and filters). |
status | active | all | open | in_progress | done | snoozed | delegated | cancelled | default active |
source | meeting_summary | manual | agent_chat | call_summary | |
meeting_id | string | |
updated_since | date-time | |
due_after | date-time | |
due_before | date-time | |
order | recent | updated | |
ids | string | GET /tasks: 1 to 50 comma-separated task ids (any status). Only the ones your key can read come back. |
q | string | Keyword search: every word must match (prefix match for meetings). Needs search:read. |
curl "https://mesakem.com/api/v1/tasks?status=active&limit=25" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"data": [
{
"id": "agent_task_5c1f9a2b",
"object": "task",
"privacy": "visible",
"title": "לשלוח הצעת מחיר לאקמה",
"description": null,
"status": "open",
"source": {
"type": "meeting_summary",
"meeting_id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"summary_id": "summary_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e"
},
"assignee": {
"name": "Dana Levi",
"email": "dana@acme.co.il"
},
"due_at": "2026-10-20T09:00:00.000Z",
"snoozed_until": null,
"items_count": 2,
"app_url": "https://mesakem.com/dashboard/tasks",
"created_at": "2026-10-15T09:52:20.000Z",
"updated_at": "2026-10-16T07:10:00.000Z"
}
],
"next_cursor": null,
"has_more": false
}/tasks→ 201 Createdtasks:write| Field | Type | Notes |
|---|---|---|
title · required | string | up to 180 characters |
description | string | null | up to 4000 characters |
status | string | one of: openin_progressdonesnoozeddelegatedcancelleddefault "open" |
due_at | date-time | null | |
assignee | object | null | |
items | array<string> | Checklist rows.≤ 24 items |
curl -X POST "https://mesakem.com/api/v1/tasks" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"title": "Send Acme the proposal",
"due_at": "2026-10-20T09:00:00Z",
"items": [
"Confirm pricing with finance"
]
}'{
"id": "agent_task_5c1f9a2b",
"object": "task",
"privacy": "visible",
"title": "לשלוח הצעת מחיר לאקמה",
"description": null,
"status": "open",
"source": {
"type": "manual"
},
"assignee": {
"name": "Dana Levi",
"email": "dana@acme.co.il"
},
"due_at": "2026-10-20T09:00:00.000Z",
"snoozed_until": null,
"items_count": 1,
"app_url": "https://mesakem.com/dashboard/tasks",
"created_at": "2026-10-18T09:00:00.000Z",
"updated_at": "2026-10-18T09:00:00.000Z",
"description_oversized": false,
"items": [
{
"id": "agent_task_item_1",
"title": "לאשר תמחור מול הכספים",
"completed": false,
"position": 1000
}
],
"items_offset": 0,
"items_has_more": false
}/tasks/{task_id}tasks:read| Parameters | Type | Notes |
|---|---|---|
task_id · required | string | in path |
items_limit | integer (1–100) | With expand=meetings / calls. |
items_offset | integer (0–) | default 0 |
curl "https://mesakem.com/api/v1/tasks/agent_task_5c1f9a2b?items_limit=100" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"id": "agent_task_5c1f9a2b",
"object": "task",
"privacy": "visible",
"title": "לשלוח הצעת מחיר לאקמה",
"description": null,
"status": "open",
"source": {
"type": "meeting_summary",
"meeting_id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"summary_id": "summary_2b7d0c1e-8f9a-4b3c-9d2e-5f6a7b8c9d0e"
},
"assignee": {
"name": "Dana Levi",
"email": "dana@acme.co.il"
},
"due_at": "2026-10-20T09:00:00.000Z",
"snoozed_until": null,
"items_count": 2,
"app_url": "https://mesakem.com/dashboard/tasks",
"created_at": "2026-10-15T09:52:20.000Z",
"updated_at": "2026-10-16T07:10:00.000Z",
"description_oversized": false,
"items": [
{
"id": "agent_task_item_1",
"title": "לאשר תמחור מול הכספים",
"completed": true,
"position": 1000
},
{
"id": "agent_task_item_2",
"title": "לשלוח ב-PDF",
"completed": false,
"position": 2000
}
],
"items_offset": 0,
"items_has_more": false
}/tasks/{task_id}tasks:write| Parameters | Type | Notes |
|---|---|---|
task_id · required | string | in path |
| Field | Type | Notes |
|---|---|---|
title | string | up to 180 characters |
description | string | null | up to 4000 characters |
status | string | one of: openin_progressdonesnoozeddelegatedcancelled |
due_at | date-time | null | |
assignee | object | null | Replaces the assignee; null clears it. |
curl -X PATCH "https://mesakem.com/api/v1/tasks/agent_task_5c1f9a2b" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"status": "done"
}'{
"id": "agent_task_5c1f9a2b",
"object": "task",
"privacy": "visible",
"title": "לשלוח הצעת מחיר לאקמה",
"description": null,
"status": "in_progress",
"source": {
"type": "manual"
},
"assignee": {
"name": "Dana Levi",
"email": "dana@acme.co.il"
},
"due_at": "2026-10-20T09:00:00.000Z",
"snoozed_until": null,
"items_count": 1,
"app_url": "https://mesakem.com/dashboard/tasks",
"created_at": "2026-10-18T09:00:00.000Z",
"updated_at": "2026-10-18T09:00:00.000Z",
"description_oversized": false,
"items": [
{
"id": "agent_task_item_1",
"title": "לאשר תמחור מול הכספים",
"completed": false,
"position": 1000
}
],
"items_offset": 0,
"items_has_more": false
}/tasks/{task_id}tasks:writeMesakem has no hard delete for tasks: the task is kept with status cancelled.
| Parameters | Type | Notes |
|---|---|---|
task_id · required | string | in path |
curl -X DELETE "https://mesakem.com/api/v1/tasks/agent_task_5c1f9a2b" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"id": "agent_task_5c1f9a2b",
"object": "task",
"privacy": "visible",
"title": "לשלוח הצעת מחיר לאקמה",
"description": null,
"status": "cancelled",
"source": {
"type": "manual"
},
"assignee": {
"name": "Dana Levi",
"email": "dana@acme.co.il"
},
"due_at": "2026-10-20T09:00:00.000Z",
"snoozed_until": null,
"items_count": 1,
"app_url": "https://mesakem.com/dashboard/tasks",
"created_at": "2026-10-18T09:00:00.000Z",
"updated_at": "2026-10-18T09:00:00.000Z",
"description_oversized": false,
"items": [
{
"id": "agent_task_item_1",
"title": "לאשר תמחור מול הכספים",
"completed": false,
"position": 1000
}
],
"items_offset": 0,
"items_has_more": false
}/tasks/{task_id}/items→ 201 Createdtasks:write| Parameters | Type | Notes |
|---|---|---|
task_id · required | string | in path |
| Field | Type | Notes |
|---|---|---|
title · required | string | up to 180 characters |
curl -X POST "https://mesakem.com/api/v1/tasks/agent_task_5c1f9a2b/items" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"title": "Attach the PDF"
}'{
"id": "agent_task_5c1f9a2b",
"object": "task",
"privacy": "visible",
"title": "לשלוח הצעת מחיר לאקמה",
"description": null,
"status": "open",
"source": {
"type": "manual"
},
"assignee": {
"name": "Dana Levi",
"email": "dana@acme.co.il"
},
"due_at": "2026-10-20T09:00:00.000Z",
"snoozed_until": null,
"items_count": 2,
"app_url": "https://mesakem.com/dashboard/tasks",
"created_at": "2026-10-18T09:00:00.000Z",
"updated_at": "2026-10-18T09:00:00.000Z",
"description_oversized": false,
"items": [
{
"id": "agent_task_item_1",
"title": "לאשר תמחור מול הכספים",
"completed": false,
"position": 1000
},
{
"id": "agent_task_item_2",
"title": "לשלוח ב-PDF",
"completed": false,
"position": 2000
}
],
"items_offset": 0,
"items_has_more": false,
"item": {
"id": "agent_task_item_2",
"title": "לשלוח ב-PDF",
"completed": false,
"position": 2000
}
}/tasks/{task_id}/items/{item_id}tasks:write| Parameters | Type | Notes |
|---|---|---|
task_id · required | string | in path |
item_id · required | string | in path |
| Field | Type | Notes |
|---|---|---|
completed · required | boolean |
curl -X PATCH "https://mesakem.com/api/v1/tasks/agent_task_5c1f9a2b/items/agent_task_item_2" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"completed": true
}'{
"id": "agent_task_5c1f9a2b",
"object": "task",
"privacy": "visible",
"title": "לשלוח הצעת מחיר לאקמה",
"description": null,
"status": "open",
"source": {
"type": "manual"
},
"assignee": {
"name": "Dana Levi",
"email": "dana@acme.co.il"
},
"due_at": "2026-10-20T09:00:00.000Z",
"snoozed_until": null,
"items_count": 1,
"app_url": "https://mesakem.com/dashboard/tasks",
"created_at": "2026-10-18T09:00:00.000Z",
"updated_at": "2026-10-18T09:00:00.000Z",
"description_oversized": false,
"items": [
{
"id": "agent_task_item_1",
"title": "לאשר תמחור מול הכספים",
"completed": true,
"position": 1000
}
],
"items_offset": 0,
"items_has_more": false,
"item": {
"id": "agent_task_item_1",
"title": "לאשר תמחור מול הכספים",
"completed": true,
"position": 1000
}
}/tasks/{task_id}/items/{item_id}→ 204 No Contenttasks:write| Parameters | Type | Notes |
|---|---|---|
task_id · required | string | in path |
item_id · required | string | in path |
curl -X DELETE "https://mesakem.com/api/v1/tasks/agent_task_5c1f9a2b/items/agent_task_item_2" \
-H "Authorization: Bearer $MESAKEM_API_KEY"/team/membersteam:readPersonal workspaces return an empty list and team_id null. An organization key (msk_org_…, created in the organization dashboard) lists every active member of its organization.
| Parameters | Type | Notes |
|---|---|---|
limit | integer (1–100) | default 25 |
cursor | string | next_cursor from the previous page of the SAME request (same key and filters). |
curl "https://mesakem.com/api/v1/team/members?limit=25" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"team_id": "org_5e4d3c2b",
"data": [
{
"id": "user_1f2e3d4c",
"name": "Noa Cohen",
"email": "noa@acme.co.il",
"role": "member"
}
],
"next_cursor": null,
"has_more": false
}/webhookswebhooks:readcurl "https://mesakem.com/api/v1/webhooks" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"data": [
{
"object": "webhook_endpoint",
"id": "whk_3c2b1a0f9e8d7c6b5a493827161504f3",
"url": "https://hooks.acme.co.il/mesakem",
"description": "CRM sync",
"events": [
"summary.ready",
"action_items.created",
"meeting.deleted"
],
"filters": {},
"signature_format": "standard",
"enabled": true,
"status": "healthy",
"disabled_reason": null,
"disabled_at": null,
"secret_hint": "Qx9k",
"secret_rotation_ends_at": null,
"failure_streak": 0,
"last_attempt_at": "2026-10-18T09:52:21.000Z",
"last_success_at": "2026-10-18T09:52:21.000Z",
"last_status": 200,
"created_at": "2026-10-18T08:00:00.000Z",
"updated_at": "2026-10-18T08:00:00.000Z"
}
],
"limit": 10,
"has_more": false,
"next_cursor": null
}/webhooks→ 201 Createdwebhooks:writeReturns the signing secret (whsec_…) once. The URL must be https on a public host; private, loopback and metadata addresses are refused, now and on every delivery.
| Field | Type | Notes |
|---|---|---|
url · required | uri | https only, port 443 or 8443, a public host.up to 2048 characters |
events · required | array<string> | 1–64 itemsevent names or alternate names — see the catalog |
description | string | up to 200 characters |
filters.sources | array<string> | Only meetings from these sources (the meeting source field).one of: google_meetzoomteamsphoneuploaddesktopemailunknown |
filters.room_ids | array<string> | Only meetings in, and events of, these rooms.≤ 50 items |
signature_format | standard | simple_hmac | simple_hmac also sends the X-Webhook-Signature header, for receivers that cannot verify Standard Webhooks.default "standard" |
enabled | boolean | default true |
curl -X POST "https://mesakem.com/api/v1/webhooks" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.example.com/mesakem",
"events": [
"summary.ready",
"action_items.created",
"meeting.deleted"
],
"description": "CRM sync"
}'{
"object": "webhook_endpoint",
"id": "whk_3c2b1a0f9e8d7c6b5a493827161504f3",
"url": "https://hooks.acme.co.il/mesakem",
"description": "CRM sync",
"events": [
"summary.ready",
"action_items.created",
"meeting.deleted"
],
"filters": {},
"signature_format": "standard",
"enabled": true,
"status": "healthy",
"disabled_reason": null,
"disabled_at": null,
"secret_hint": "Qx9k",
"secret_rotation_ends_at": null,
"failure_streak": 0,
"last_attempt_at": "2026-10-18T09:52:21.000Z",
"last_success_at": "2026-10-18T09:52:21.000Z",
"last_status": 200,
"created_at": "2026-10-18T08:00:00.000Z",
"updated_at": "2026-10-18T08:00:00.000Z",
"secret": "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"
}/webhooks/{endpoint_id}webhooks:read| Parameters | Type | Notes |
|---|---|---|
endpoint_id · required | string | in path |
curl "https://mesakem.com/api/v1/webhooks/whk_3c2b1a0f9e8d7c6b5a493827161504f3" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "webhook_endpoint",
"id": "whk_3c2b1a0f9e8d7c6b5a493827161504f3",
"url": "https://hooks.acme.co.il/mesakem",
"description": "CRM sync",
"events": [
"summary.ready",
"action_items.created",
"meeting.deleted"
],
"filters": {},
"signature_format": "standard",
"enabled": true,
"status": "healthy",
"disabled_reason": null,
"disabled_at": null,
"secret_hint": "Qx9k",
"secret_rotation_ends_at": null,
"failure_streak": 0,
"last_attempt_at": "2026-10-18T09:52:21.000Z",
"last_success_at": "2026-10-18T09:52:21.000Z",
"last_status": 200,
"created_at": "2026-10-18T08:00:00.000Z",
"updated_at": "2026-10-18T08:00:00.000Z"
}/webhooks/{endpoint_id}webhooks:writeSend only the fields to change. enabled=true re-enables an endpoint disabled after failures.
| Parameters | Type | Notes |
|---|---|---|
endpoint_id · required | string | in path |
| Field | Type | Notes |
|---|---|---|
url | uri | up to 2048 characters |
events | array<string> | 1–64 itemsevent names or alternate names — see the catalog |
description | string | null | up to 200 characters |
filters.sources | array<string> | Only meetings from these sources (the meeting source field).one of: google_meetzoomteamsphoneuploaddesktopemailunknown |
filters.room_ids | array<string> | Only meetings in, and events of, these rooms.≤ 50 items |
signature_format | standard | simple_hmac | |
enabled | boolean | true re-enables an endpoint disabled after failures and resets its failure count. |
curl -X PATCH "https://mesakem.com/api/v1/webhooks/whk_3c2b1a0f9e8d7c6b5a493827161504f3" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"events": [
"summary.ready",
"summary.updated",
"meeting.deleted"
],
"enabled": true
}'{
"object": "webhook_endpoint",
"id": "whk_3c2b1a0f9e8d7c6b5a493827161504f3",
"url": "https://hooks.acme.co.il/mesakem",
"description": "CRM sync (v2)",
"events": [
"summary.ready",
"action_items.created",
"meeting.deleted"
],
"filters": {},
"signature_format": "standard",
"enabled": true,
"status": "healthy",
"disabled_reason": null,
"disabled_at": null,
"secret_hint": "Qx9k",
"secret_rotation_ends_at": null,
"failure_streak": 0,
"last_attempt_at": "2026-10-18T09:52:21.000Z",
"last_success_at": "2026-10-18T09:52:21.000Z",
"last_status": 200,
"created_at": "2026-10-18T08:00:00.000Z",
"updated_at": "2026-10-18T10:00:00.000Z"
}/webhooks/{endpoint_id}webhooks:writeIts pending deliveries are dropped.
| Parameters | Type | Notes |
|---|---|---|
endpoint_id · required | string | in path |
curl -X DELETE "https://mesakem.com/api/v1/webhooks/whk_3c2b1a0f9e8d7c6b5a493827161504f3" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "webhook_endpoint",
"id": "whk_3c2b1a0f9e8d7c6b5a493827161504f3",
"deleted": true
}/webhooks/{endpoint_id}/rotate-secretwebhooks:writeThe new secret signs at once; for 24 hours deliveries carry both signatures, so you can switch without downtime.
| Parameters | Type | Notes |
|---|---|---|
endpoint_id · required | string | in path |
curl -X POST "https://mesakem.com/api/v1/webhooks/whk_3c2b1a0f9e8d7c6b5a493827161504f3/rotate-secret" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "webhook_endpoint",
"id": "whk_3c2b1a0f9e8d7c6b5a493827161504f3",
"url": "https://hooks.acme.co.il/mesakem",
"description": "CRM sync",
"events": [
"summary.ready",
"action_items.created",
"meeting.deleted"
],
"filters": {},
"signature_format": "standard",
"enabled": true,
"status": "healthy",
"disabled_reason": null,
"disabled_at": null,
"secret_hint": "Lm3p",
"secret_rotation_ends_at": "2026-10-19T10:00:00.000Z",
"failure_streak": 0,
"last_attempt_at": "2026-10-18T09:52:21.000Z",
"last_success_at": "2026-10-18T09:52:21.000Z",
"last_status": 200,
"created_at": "2026-10-18T08:00:00.000Z",
"updated_at": "2026-10-18T08:00:00.000Z",
"secret": "whsec_Lm3pZx8rW2vT6yQ1nB5kD9fH4jS7aC0eG2iK"
}/webhooks/{endpoint_id}/testwebhooks:writeSends webhook.test synchronously and returns your endpoint's status, latency and the first 512 bytes of its answer. Nothing is stored.
| Parameters | Type | Notes |
|---|---|---|
endpoint_id · required | string | in path |
curl -X POST "https://mesakem.com/api/v1/webhooks/whk_3c2b1a0f9e8d7c6b5a493827161504f3/test" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "webhook_test",
"endpoint_id": "whk_3c2b1a0f9e8d7c6b5a493827161504f3",
"message_id": "msg_0f1e2d3c4b5a69788796a5b4c3d2e1f0",
"delivered": true,
"status": 200,
"latency_ms": 162,
"error": null,
"response_snippet": "ok"
}/webhooks/{endpoint_id}/deliverieswebhooks:readNewest first. Each row is one delivery with its latest attempt.
| Parameters | Type | Notes |
|---|---|---|
endpoint_id · required | string | in path |
limit | integer (1–100) | default 25 |
cursor | string | next_cursor from the previous page of the SAME request (same key and filters). |
curl "https://mesakem.com/api/v1/webhooks/whk_3c2b1a0f9e8d7c6b5a493827161504f3/deliveries?limit=25" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"data": [
{
"object": "webhook_delivery",
"id": "whd_9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"endpoint_id": "whk_3c2b1a0f9e8d7c6b5a493827161504f3",
"event_id": "msg_1a2b3c4d5e6f708192a3b4c5d6e7f809",
"type": "summary.ready",
"state": "succeeded",
"attempt": 1,
"max_attempts": 9,
"last_status": 200,
"last_error": null,
"latency_ms": 184,
"next_attempt_at": null,
"response_snippet": "{\"ok\":true}",
"redelivery_of": null,
"created_at": "2026-10-18T09:52:20.000Z",
"completed_at": "2026-10-18T09:52:21.000Z"
},
{
"object": "webhook_delivery",
"id": "whd_0a1b2c3d4e5f60718293a4b5c6d7e8f9",
"endpoint_id": "whk_3c2b1a0f9e8d7c6b5a493827161504f3",
"event_id": "msg_1a2b3c4d5e6f708192a3b4c5d6e7f809",
"type": "meeting.ended",
"state": "retry_scheduled",
"attempt": 3,
"max_attempts": 9,
"last_status": 503,
"last_error": "http_503",
"latency_ms": 10000,
"next_attempt_at": "2026-10-18T09:58:00.000Z",
"response_snippet": "Service Unavailable",
"redelivery_of": null,
"created_at": "2026-10-18T09:52:20.000Z",
"completed_at": null
}
],
"has_more": false,
"next_cursor": null
}/webhooks/{endpoint_id}/deliveries/{delivery_id}/redeliver→ 202 Acceptedwebhooks:writeA new attempt series for a finished delivery, with the same webhook-id (dedupe on it).
| Parameters | Type | Notes |
|---|---|---|
endpoint_id · required | string | in path |
delivery_id · required | string | in path |
curl -X POST "https://mesakem.com/api/v1/webhooks/whk_3c2b1a0f9e8d7c6b5a493827161504f3/deliveries/whd_9f8e7d6c5b4a39281706f5e4d3c2b1a0/redeliver" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "webhook_delivery",
"id": "whd_5e4d3c2b1a0f9e8d7c6b5a4938271605",
"endpoint_id": "whk_3c2b1a0f9e8d7c6b5a493827161504f3",
"event_id": "msg_1a2b3c4d5e6f708192a3b4c5d6e7f809",
"type": "summary.ready",
"state": "pending",
"attempt": 0,
"max_attempts": 9,
"last_status": null,
"last_error": null,
"latency_ms": null,
"next_attempt_at": null,
"response_snippet": null,
"redelivery_of": "whd_9f8e7d6c5b4a39281706f5e4d3c2b1a0",
"created_at": "2026-10-18T11:00:00.000Z",
"completed_at": null
}/webhook-event-typeswebhooks:readEvery event type, its alternate name (if any) and payload fields, with Hebrew and English descriptions.
curl "https://mesakem.com/api/v1/webhook-event-types" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"data": [
{
"object": "webhook_event_type",
"type": "meeting.scheduled",
"alias": null,
"group": "meetings",
"data_object": "meeting",
"fields": [
"meeting_id",
"source",
"scheduled_start_time",
"title"
],
"description": "A meeting was scheduled for the notetaker (calendar, link or manual).",
"description_he": "פגישה נקבעה לבוט (מהיומן, מקישור או ידנית).",
"description_en": "A meeting was scheduled for the notetaker (calendar, link or manual)."
},
{
"object": "webhook_event_type",
"type": "meeting.bot_status_changed",
"alias": null,
"group": "meetings",
"data_object": "meeting",
"fields": [
"meeting_id",
"bot_status",
"previous_status"
],
"description": "The notetaker is joining, waiting in the lobby, was not admitted or was removed.",
"description_he": "הבוט מצטרף, ממתין בלובי, לא אושר או הוצא מהפגישה.",
"description_en": "The notetaker is joining, waiting in the lobby, was not admitted or was removed."
}
],
"has_more": false,
"next_cursor": null
}/meetings/bot→ 202 Acceptedbot:writeNeeds bot:write on a paid plan. Hard limits per user and per work area (minute, hour, day) protect against runaway costs; the plan's meeting quota applies. A meeting that already has a Mesakem bot answers 409 meeting_bot_already_active with that meeting's meeting_id. Send an Idempotency-Key so a retry never sends a second bot.
| Field | Type | Notes |
|---|---|---|
meeting_url · required | string | A Zoom, Google Meet or Microsoft Teams link (a pasted invitation works too).up to 1024 characters |
title | string | up to 180 characters |
language | string | Conversation language, e.g. he, en, auto. Default: the key owner's saved bot language. |
summary_language | he | en | |
summary_recipient_email | email | A verified summary recipient of the work area. Default: the key owner, else the default recipient. |
start_time | date-time | Join at this time instead of now (at most 60 days ahead). |
end_time | date-time |
curl -X POST "https://mesakem.com/api/v1/meetings/bot" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"meeting_url": "https://zoom.us/j/1234567890?pwd=abc123",
"title": "Discovery call — Acme"
}'{
"object": "bot_dispatch",
"meeting_id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"status": "scheduling",
"status_detail": "queued",
"scheduled_start_time": null,
"app_url": "https://mesakem.com/dashboard/meeting/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b"
}/meetings/{meeting_id}/bot→ 202 Acceptedbot:writeevent_id is the cal_evt_… id from GET /meetings/upcoming. The same switch as "join" on the dashboard's calendar.
| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
| Field | Type | Notes |
|---|---|---|
apply_to_series | boolean | Also join every future meeting of this recurring series.default false |
curl -X POST "https://mesakem.com/api/v1/meetings/cal_evt_Qm9pZ2h0LXNlcmllcy0x/bot" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"apply_to_series": false
}'{
"object": "bot_schedule",
"event_id": "cal_evt_Qm9pZ2h0LXNlcmllcy0x",
"status": "scheduling",
"meeting_id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"admission": {
"accepted": true,
"reason": null
},
"apply_to_series": false,
"start_time": "2026-10-20T07:00:00.000Z"
}/meetings/{meeting_id}/bot→ 202 Acceptedbot:writecal_evt_…: the bot will not join (the dashboard's "skip"). run_…: the bot in the call leaves now; the recording so far is transcribed and summarized as usual. Only the meeting's owner.
| Parameters | Type | Notes |
|---|---|---|
meeting_id · required | string | in path |
apply_to_series | true | false | cal_evt_… only: also skip every future meeting of the series. |
curl -X DELETE "https://mesakem.com/api/v1/meetings/cal_evt_Qm9pZ2h0LXNlcmllcy0x/bot" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "bot_schedule",
"event_id": "cal_evt_Qm9pZ2h0LXNlcmllcy0x",
"status": "cancelling",
"cancelled_meetings": 1,
"apply_to_series": false
}/settings/notetaker-automationsettings:readcurl "https://mesakem.com/api/v1/settings/notetaker-automation" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "notetaker_automation",
"automation": "JOIN_AS_HOST",
"allowed": true
}/settings/notetaker-automationsettings:writeMANUAL: never automatically. JOIN_ALL_EVENTS: every meeting with a supported link. JOIN_EXTERNAL_ONLY: only meetings with people outside your domain. JOIN_AS_HOST: only meetings you organize.
| Field | Type | Notes |
|---|---|---|
automation · required | MANUAL | JOIN_ALL_EVENTS | JOIN_EXTERNAL_ONLY | JOIN_AS_HOST |
curl -X PUT "https://mesakem.com/api/v1/settings/notetaker-automation" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"automation": "JOIN_AS_HOST"
}'{
"object": "notetaker_automation",
"automation": "JOIN_EXTERNAL_ONLY",
"allowed": true
}/uploads→ 201 Createduploads:writePUT the file to upload.url with the given headers, then call POST /uploads/{upload_id}/complete. At most 3 uploads in progress at a time.
| Field | Type | Notes |
|---|---|---|
filename · required | string | Extension mp3, wav, m4a, mp4 or webm.up to 180 characters |
content_type · required | string | one of: audio/mpegaudio/mp3audio/wavaudio/x-wavaudio/mp4audio/m4aaudio/x-m4aaudio/aacaudio/webmvideo/mp4video/webmvideo/quicktime |
size_bytes · required | integer | Exact size; at most 200 MB unless configured otherwise. |
title | string | up to 180 characters |
language | string | |
summary_language | he | en | |
category | meeting | call | default "meeting" |
curl -X POST "https://mesakem.com/api/v1/uploads" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"filename": "call.m4a",
"content_type": "audio/mp4",
"size_bytes": 3145728,
"language": "he"
}'{
"object": "upload",
"id": "recjob_8a1b2c3d4e5f60718293a4b5c6d7e8f9",
"meeting_id": "run_upload_8a1b2c3d4e5f60718293a4b5c6d7e8f9",
"filename": "call.m4a",
"content_type": "audio/mp4",
"size_bytes": 3145728,
"app_url": "https://mesakem.com/dashboard/meeting/run_upload_8a1b2c3d4e5f60718293a4b5c6d7e8f9",
"created_at": "2026-10-18T09:00:00.000Z",
"status": "awaiting_upload",
"upload": {
"url": "https://storage.example/uploaded-recordings/…?X-Amz-Signature=…",
"method": "PUT",
"headers": {
"content-type": "audio/mp4",
"content-length": "3145728"
},
"expires_at": "2026-10-18T09:15:00.000Z"
}
}/uploads/{upload_id}/complete→ 202 Accepteduploads:writeChecks the stored file's size and type, then queues transcription and the summary.
| Parameters | Type | Notes |
|---|---|---|
upload_id · required | string | in path |
| Field | Type | Notes |
|---|---|---|
size_bytes | integer | Default: the size declared at POST /uploads. |
curl -X POST "https://mesakem.com/api/v1/uploads/recjob_8a1b2c3d4e5f60718293a4b5c6d7e8f9/complete" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"object": "upload",
"id": "recjob_8a1b2c3d4e5f60718293a4b5c6d7e8f9",
"meeting_id": "run_upload_8a1b2c3d4e5f60718293a4b5c6d7e8f9",
"filename": "call.m4a",
"content_type": "audio/mp4",
"size_bytes": 3145728,
"app_url": "https://mesakem.com/dashboard/meeting/run_upload_8a1b2c3d4e5f60718293a4b5c6d7e8f9",
"created_at": "2026-10-18T09:00:00.000Z",
"status": "processing"
}/uploads/{upload_id}meetings:readThe object upload.failed names: status and error code. The uploader only.
| Parameters | Type | Notes |
|---|---|---|
upload_id · required | string | in path |
curl "https://mesakem.com/api/v1/uploads/recjob_8a1b2c3d4e5f60718293a4b5c6d7e8f9" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "upload",
"id": "recjob_8a1b2c3d4e5f60718293a4b5c6d7e8f9",
"meeting_id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"status": "failed",
"category": "meeting",
"filename": "interview.m4a",
"content_type": "audio/mp4",
"size_bytes": 18234567,
"duration": null,
"error_code": "transcription_failed",
"app_url": "https://mesakem.com/dashboard/meeting/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"created_at": "2026-10-16T09:00:00.000Z",
"updated_at": "2026-10-16T09:04:00.000Z"
}/roomsrooms:readYour rooms and the work area's shared rooms; another member's private room is never listed. Counts include only items you can read.
| Parameters | Type | Notes |
|---|---|---|
limit | integer (1–100) | default 25 |
cursor | string | next_cursor from the previous page of the SAME request (same key and filters). |
archived | true | false | default false |
search | string | Room name, description or client name contains this (case-insensitive). |
curl "https://mesakem.com/api/v1/rooms?limit=25" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"data": [
{
"id": "room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a",
"object": "room",
"name": "אקמה — פיילוט",
"description": "כל הפגישות עם אקמה",
"client_name": "Acme",
"keywords": [
"אקמה",
"פיילוט"
],
"visibility": "private",
"archived": false,
"created_by_you": true,
"meeting_count": 4,
"call_count": 1,
"last_activity_at": "2026-10-16T10:00:00.000Z",
"app_url": "https://mesakem.com/dashboard/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a",
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-10-16T10:00:00.000Z"
}
],
"next_cursor": null,
"has_more": false
}/rooms→ 201 Createdrooms:write| Field | Type | Notes |
|---|---|---|
name · required | string | The room's name (title is accepted as the same field).up to 120 characters |
title | string | Same as name.up to 120 characters |
description | string | null | up to 4000 characters |
client_name | string | null | up to 200 characters |
keywords | array<string> | ≤ 100 items |
curl -X POST "https://mesakem.com/api/v1/rooms" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme pilot",
"client_name": "Acme"
}'{
"id": "room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a",
"object": "room",
"name": "אקמה — פיילוט",
"description": "כל הפגישות עם אקמה",
"client_name": "Acme",
"keywords": [
"אקמה",
"פיילוט"
],
"visibility": "private",
"archived": false,
"created_by_you": true,
"meeting_count": 0,
"call_count": 0,
"last_activity_at": "2026-10-16T10:00:00.000Z",
"app_url": "https://mesakem.com/dashboard/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a",
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-10-16T10:00:00.000Z"
}/rooms/{room_id}rooms:readexpand=meetings,calls lists its items (newest added first).
| Parameters | Type | Notes |
|---|---|---|
room_id · required | string | in path |
expand | string | Comma-separated: participants, documents. |
items_limit | integer (1–100) | With expand=meetings / calls. |
curl "https://mesakem.com/api/v1/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a?expand=meetings" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"id": "room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a",
"object": "room",
"name": "אקמה — פיילוט",
"description": "כל הפגישות עם אקמה",
"client_name": "Acme",
"keywords": [
"אקמה",
"פיילוט"
],
"visibility": "private",
"archived": false,
"created_by_you": true,
"meeting_count": 4,
"call_count": 1,
"last_activity_at": "2026-10-16T10:00:00.000Z",
"app_url": "https://mesakem.com/dashboard/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a",
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-10-16T10:00:00.000Z",
"meetings": [
{
"id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"object": "meeting",
"title": "פגישת היכרות — אקמה",
"status": "completed",
"source": "zoom",
"start_time": "2026-10-15T09:00:12.000Z",
"added_at": "2026-10-15T10:00:00.000Z"
}
],
"meetings_has_more": false
}/rooms/{room_id}rooms:write| Parameters | Type | Notes |
|---|---|---|
room_id · required | string | in path |
| Field | Type | Notes |
|---|---|---|
name | string | The room's name (title is accepted as the same field).up to 120 characters |
title | string | Same as name.up to 120 characters |
description | string | null | up to 4000 characters |
client_name | string | null | up to 200 characters |
keywords | array<string> | ≤ 100 items |
archived | boolean | true archives, false restores. |
curl -X PATCH "https://mesakem.com/api/v1/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme — customer"
}'{
"id": "room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a",
"object": "room",
"name": "אקמה — לקוח",
"description": "כל הפגישות עם אקמה",
"client_name": "Acme",
"keywords": [
"אקמה",
"פיילוט"
],
"visibility": "private",
"archived": false,
"created_by_you": true,
"meeting_count": 4,
"call_count": 1,
"last_activity_at": "2026-10-16T10:00:00.000Z",
"app_url": "https://mesakem.com/dashboard/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a",
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-10-16T10:00:00.000Z"
}/rooms/{room_id}→ 202 Acceptedrooms:writeRooms have no hard delete: DELETE archives (PATCH archived=false restores). Its meetings are not touched.
| Parameters | Type | Notes |
|---|---|---|
room_id · required | string | in path |
curl -X DELETE "https://mesakem.com/api/v1/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"id": "room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a",
"object": "room",
"name": "אקמה — פיילוט",
"description": "כל הפגישות עם אקמה",
"client_name": "Acme",
"keywords": [
"אקמה",
"פיילוט"
],
"visibility": "private",
"archived": true,
"created_by_you": true,
"meeting_count": 4,
"call_count": 1,
"last_activity_at": "2026-10-16T10:00:00.000Z",
"app_url": "https://mesakem.com/dashboard/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a",
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-10-16T10:00:00.000Z"
}/rooms/{room_id}/meetings/{meeting_id}→ 204 No Contentrooms:write| Parameters | Type | Notes |
|---|---|---|
room_id · required | string | in path |
meeting_id · required | string | in path |
curl -X PUT "https://mesakem.com/api/v1/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"/rooms/{room_id}/meetings/{meeting_id}→ 204 No Contentrooms:write| Parameters | Type | Notes |
|---|---|---|
room_id · required | string | in path |
meeting_id · required | string | in path |
curl -X DELETE "https://mesakem.com/api/v1/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a/meetings/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b" \
-H "Authorization: Bearer $MESAKEM_API_KEY"/rooms/{room_id}/calls/{call_id}→ 204 No Contentrooms:write| Parameters | Type | Notes |
|---|---|---|
room_id · required | string | in path |
call_id · required | string | in path |
curl -X PUT "https://mesakem.com/api/v1/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a/calls/call_Y3JjXzFhMmIzYwoxNzI5MDAwMDAwLjQy" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"/rooms/{room_id}/calls/{call_id}→ 204 No Contentrooms:write| Parameters | Type | Notes |
|---|---|---|
room_id · required | string | in path |
call_id · required | string | in path |
curl -X DELETE "https://mesakem.com/api/v1/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a/calls/call_Y3JjXzFhMmIzYwoxNzI5MDAwMDAwLjQy" \
-H "Authorization: Bearer $MESAKEM_API_KEY"/rooms/{room_id}/insightsrooms:readReturns what already exists: the decisions on each meeting's summary, and analyses made in the dashboard. Nothing is generated by this call.
| Parameters | Type | Notes |
|---|---|---|
room_id · required | string | in path |
curl "https://mesakem.com/api/v1/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a/insights" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "room_insights",
"room_id": "room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a",
"source_count": 4,
"decision_log": [
{
"source": {
"type": "meeting",
"id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b"
},
"title": "פגישת היכרות — אקמה",
"occurred_at": "2026-10-15T09:00:12.000Z",
"decisions": [
"פיילוט של חודש"
]
}
],
"analyses": {
"decisions": null,
"trends": {
"kind": "trend_analysis",
"created_at": "2026-10-10T12:00:00.000Z",
"stale": true,
"content": {
"momentum": "…",
"open_threads": [],
"risks": [],
"sentiment_by_meeting": [],
"next_step_suggestions": []
}
}
},
"generated_on_request": false
}/rooms/{room_id}/permissionsshares:read| Parameters | Type | Notes |
|---|---|---|
room_id · required | string | in path |
curl "https://mesakem.com/api/v1/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a/permissions" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"data": [],
"share_url": null,
"next_cursor": null,
"has_more": false
}/rooms/{room_id}/permissionsshares:writeAnswers 422 public_link_in_dashboard: a room's public link is created in the dashboard, where you choose its meetings. Revoking works here.
| Parameters | Type | Notes |
|---|---|---|
room_id · required | string | in path |
| Field | Type | Notes |
|---|---|---|
recipient · required | object | |
role | "read" |
curl -X POST "https://mesakem.com/api/v1/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a/permissions" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"recipient": {
"type": "anyone"
},
"role": "read"
}'{
"id": "perm_anyone",
"object": "permission",
"recipient": {
"type": "anyone"
},
"role": "read",
"status": "ready",
"share_url": "https://mesakem.com/r#…",
"created_at": null
}/rooms/{room_id}/permissions/{permission_id}→ 204 No Contentshares:write| Parameters | Type | Notes |
|---|---|---|
room_id · required | string | in path |
permission_id · required | string | in path |
curl -X DELETE "https://mesakem.com/api/v1/rooms/room_3c2b1a09-8f7e-4d6c-9b5a-4f3e2d1c0b9a/permissions/perm_anyone" \
-H "Authorization: Bearer $MESAKEM_API_KEY"/callscalls:readCalls recorded from your connected phone system. Calls that produced a meeting also appear in GET /meetings (source phone).
| Parameters | Type | Notes |
|---|---|---|
limit | integer (1–100) | default 25 |
cursor | string | next_cursor from the previous page of the SAME request (same key and filters). |
from | date-time | ISO 8601 with offset, or YYYY-MM-DD (00:00 UTC). |
to | date-time |
curl "https://mesakem.com/api/v1/calls?limit=25" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"data": [
{
"id": "call_Y3JjXzFhMmIzYwoxNzI5MDAwMDAwLjQy",
"object": "call",
"title": "דנה לוי",
"provider": "link",
"direction": "outbound",
"duration": 312,
"status": "ready",
"contact_name": "דנה לוי",
"caller": "035551234",
"callee": "0525551234",
"recorded_date": "15/10/2026",
"recorded_time": "11:42",
"start_time": "2026-10-15T08:42:00.000Z",
"language": "he",
"has_transcript": true,
"has_summary": true,
"has_recording": true,
"meeting_id": "run_9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"app_url": "https://mesakem.com/dashboard/meeting/run_9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"created_at": "2026-10-15T08:47:00.000Z",
"updated_at": "2026-10-15T08:51:00.000Z"
}
],
"next_cursor": null,
"has_more": false
}/calls/{call_id}calls:read| Parameters | Type | Notes |
|---|---|---|
call_id · required | string | in path |
curl "https://mesakem.com/api/v1/calls/call_Y3JjXzFhMmIzYwoxNzI5MDAwMDAwLjQy" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"id": "call_Y3JjXzFhMmIzYwoxNzI5MDAwMDAwLjQy",
"object": "call",
"title": "דנה לוי",
"provider": "link",
"direction": "outbound",
"duration": 312,
"status": "ready",
"contact_name": "דנה לוי",
"caller": "035551234",
"callee": "0525551234",
"recorded_date": "15/10/2026",
"recorded_time": "11:42",
"start_time": "2026-10-15T08:42:00.000Z",
"language": "he",
"has_transcript": true,
"has_summary": true,
"has_recording": true,
"meeting_id": "run_9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"app_url": "https://mesakem.com/dashboard/meeting/run_9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"created_at": "2026-10-15T08:47:00.000Z",
"updated_at": "2026-10-15T08:51:00.000Z"
}/calls/{call_id}/transcriptcalls:read| Parameters | Type | Notes |
|---|---|---|
call_id · required | string | in path |
format | string |
curl "https://mesakem.com/api/v1/calls/call_Y3JjXzFhMmIzYwoxNzI5MDAwMDAwLjQy/transcript" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "call_transcript",
"call_id": "call_Y3JjXzFhMmIzYwoxNzI5MDAwMDAwLjQy",
"meeting_id": "run_9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"language": "he",
"text": "דובר 1: שלום, מדברת דנה…",
"text_oversized": false
}/calls/{call_id}/summarycalls:read| Parameters | Type | Notes |
|---|---|---|
call_id · required | string | in path |
format | string |
curl "https://mesakem.com/api/v1/calls/call_Y3JjXzFhMmIzYwoxNzI5MDAwMDAwLjQy/summary?format=markdown" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "call_summary",
"call_id": "call_Y3JjXzFhMmIzYwoxNzI5MDAwMDAwLjQy",
"meeting_id": "run_9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"summary_id": "summary_1b2c3d4e-5f6a-4b7c-8d9e-0f1a2b3c4d5e",
"language": "he",
"body_markdown": "## סיכום\nהלקוחה ביקשה הצעת מחיר…",
"action_items": [
{
"text": "לשלוח הצעת מחיר"
}
],
"decisions": [],
"edited": false,
"created_at": "2026-10-15T08:51:00.000Z"
}/calls/{call_id}/recordingcalls:read| Parameters | Type | Notes |
|---|---|---|
call_id · required | string | in path |
curl "https://mesakem.com/api/v1/calls/call_Y3JjXzFhMmIzYwoxNzI5MDAwMDAwLjQy/recording" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "recording_link",
"call_id": "call_Y3JjXzFhMmIzYwoxNzI5MDAwMDAwLjQy",
"meeting_id": "run_9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"recording_id": "recording_5d6e7f8a-9b0c-4d1e-8f2a-3b4c5d6e7f8a",
"status": "ready",
"recording_url": "https://mesakem.com/api/v1/r/Zm9yLWV4YW1wbGUtb25seQ",
"expires_at": "2026-10-18T08:05:00.000Z",
"format": "mp3",
"duration": 312,
"created_at": "2026-10-15T08:47:00.000Z"
}/searchsearch:readKeyword search over your own data: meeting titles and summaries, task titles and descriptions, room names, and meeting invitees. Every word must match. Results follow each resource's read rule.
| Parameters | Type | Notes |
|---|---|---|
q | string | Keyword search: every word must match (prefix match for meetings). Needs search:read. |
types | string | Comma-separated: meeting, task, room, person. Default: every type your key can read. |
limit | integer (1–100) | default 25 |
from | date-time | ISO 8601 with offset, or YYYY-MM-DD (00:00 UTC). |
to | date-time |
curl "https://mesakem.com/api/v1/search?q=proposal&types=meeting%2Ctask" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"query": "הצעת מחיר",
"types": [
"meeting",
"task",
"room",
"person"
],
"mode": "keyword",
"data": [
{
"type": "meeting",
"id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b",
"title": "פגישת היכרות — אקמה",
"snippet": "הוסכם לשלוח הצעת מחיר עד יום ראשון…",
"status": "completed",
"source": "zoom",
"start_time": "2026-10-15T09:00:12.000Z",
"match": {
"title": false,
"summary": true
},
"app_url": "https://mesakem.com/dashboard/meeting/run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b"
},
{
"type": "task",
"id": "agent_task_5c1f9a2b",
"title": "לשלוח הצעת מחיר לאקמה",
"snippet": null,
"status": "open",
"updated_at": "2026-10-16T07:10:00.000Z",
"app_url": "https://mesakem.com/dashboard/tasks"
}
],
"has_more": false
}/templatestemplates:read| Parameters | Type | Notes |
|---|---|---|
type | meeting | call | Summary type. The focused built-in template exists for both. |
curl "https://mesakem.com/api/v1/templates?type=meeting" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"object": "list",
"data": [
{
"id": "system_detailed_mesakem",
"object": "template",
"type": "meeting",
"name": "סיכום פגישה של Mesakem",
"instructions": "…",
"built_in": true,
"is_default": true,
"format": "classic",
"source_citations": false,
"editable": false,
"created_at": "2026-10-18T09:00:00.000Z",
"updated_at": "2026-10-18T09:00:00.000Z"
},
{
"id": "summary_template_4a5b6c7d-8e9f-4a0b-9c1d-2e3f4a5b6c7d",
"object": "template",
"type": "meeting",
"name": "שיחת מכירה",
"instructions": "סכם כפגישת מכירה: צורכי הלקוח, התנגדויות, סיכוי סגירה, משימות המשך עם אחראי ותאריך, והודעת המשך קצרה ללקוח.",
"built_in": false,
"is_default": false,
"format": "classic",
"source_citations": false,
"editable": true,
"created_at": "2026-10-18T09:00:00.000Z",
"updated_at": "2026-10-18T09:00:00.000Z"
}
],
"next_cursor": null,
"has_more": false
}/templates→ 201 Createdtemplates:writeStored exactly as sent: no AI rewrites or checks it. Draft it however you like, then send it here.
| Field | Type | Notes |
|---|---|---|
name · required | string | Shown in the template picker. Not the name of a built-in template.up to 120 characters |
instructions · required | string | How to write the summary: structure, tone, emphasis, sections. Stored exactly as sent.up to 12000 characters |
type | meeting | call | default "meeting" |
make_default | boolean | default false |
source_citations | boolean | default false |
curl -X POST "https://mesakem.com/api/v1/templates" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"type": "meeting",
"name": "Discovery call",
"instructions": "Summarize as a discovery call: needs, objections, budget, next steps with owner and date."
}'{
"id": "summary_template_4a5b6c7d-8e9f-4a0b-9c1d-2e3f4a5b6c7d",
"object": "template",
"type": "meeting",
"name": "שיחת מכירה",
"instructions": "סכם כפגישת מכירה: צורכי הלקוח, התנגדויות, סיכוי סגירה, משימות המשך עם אחראי ותאריך, והודעת המשך קצרה ללקוח.",
"built_in": false,
"is_default": false,
"format": "classic",
"source_citations": false,
"editable": true,
"created_at": "2026-10-18T09:00:00.000Z",
"updated_at": "2026-10-18T09:00:00.000Z",
"outcome": "created"
}/templates/{template_id}templates:read| Parameters | Type | Notes |
|---|---|---|
template_id · required | string | in path |
type | meeting | call | Summary type. The focused built-in template exists for both. |
curl "https://mesakem.com/api/v1/templates/summary_template_4a5b6c7d-8e9f-4a0b-9c1d-2e3f4a5b6c7d" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"id": "summary_template_4a5b6c7d-8e9f-4a0b-9c1d-2e3f4a5b6c7d",
"object": "template",
"type": "meeting",
"name": "שיחת מכירה",
"instructions": "סכם כפגישת מכירה: צורכי הלקוח, התנגדויות, סיכוי סגירה, משימות המשך עם אחראי ותאריך, והודעת המשך קצרה ללקוח.",
"built_in": false,
"is_default": false,
"format": "classic",
"source_citations": false,
"editable": true,
"created_at": "2026-10-18T09:00:00.000Z",
"updated_at": "2026-10-18T09:00:00.000Z"
}/templates/{template_id}templates:write| Parameters | Type | Notes |
|---|---|---|
template_id · required | string | in path |
type | meeting | call | Summary type. The focused built-in template exists for both. |
| Field | Type | Notes |
|---|---|---|
name | string | up to 120 characters |
instructions | string | up to 12000 characters |
make_default | boolean |
curl -X PATCH "https://mesakem.com/api/v1/templates/summary_template_4a5b6c7d-8e9f-4a0b-9c1d-2e3f4a5b6c7d" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "Discovery call (v2)"
}'{
"id": "summary_template_4a5b6c7d-8e9f-4a0b-9c1d-2e3f4a5b6c7d",
"object": "template",
"type": "meeting",
"name": "שיחת מכירה",
"instructions": "סכם כפגישת מכירה: צורכי הלקוח, התנגדויות, סיכוי סגירה, משימות המשך עם אחראי ותאריך, והודעת המשך קצרה ללקוח.",
"built_in": false,
"is_default": false,
"format": "classic",
"source_citations": false,
"editable": true,
"created_at": "2026-10-18T09:00:00.000Z",
"updated_at": "2026-10-18T09:00:00.000Z"
}/templates/{template_id}→ 204 No Contenttemplates:writeBuilt-in templates cannot be changed. If it was the default, the built-in template becomes the default again.
| Parameters | Type | Notes |
|---|---|---|
template_id · required | string | in path |
type | meeting | call | Summary type. The focused built-in template exists for both. |
curl -X DELETE "https://mesakem.com/api/v1/templates/summary_template_4a5b6c7d-8e9f-4a0b-9c1d-2e3f4a5b6c7d" \
-H "Authorization: Bearer $MESAKEM_API_KEY"/templates/{template_id}/defaulttemplates:write| Parameters | Type | Notes |
|---|---|---|
template_id · required | string | in path |
type | meeting | call | Summary type. The focused built-in template exists for both. |
curl -X POST "https://mesakem.com/api/v1/templates/summary_template_4a5b6c7d-8e9f-4a0b-9c1d-2e3f4a5b6c7d/default" \
-H "Authorization: Bearer $MESAKEM_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"id": "summary_template_4a5b6c7d-8e9f-4a0b-9c1d-2e3f4a5b6c7d",
"object": "template",
"type": "meeting",
"name": "שיחת מכירה",
"instructions": "סכם כפגישת מכירה: צורכי הלקוח, התנגדויות, סיכוי סגירה, משימות המשך עם אחראי ותאריך, והודעת המשך קצרה ללקוח.",
"built_in": false,
"is_default": true,
"format": "classic",
"source_citations": false,
"editable": true,
"created_at": "2026-10-18T09:00:00.000Z",
"updated_at": "2026-10-18T09:00:00.000Z"
}/shares/{share_id}shares:readThe object share.created / share.revoked webhooks name. The link's creator only.
| Parameters | Type | Notes |
|---|---|---|
share_id · required | string | in path |
curl "https://mesakem.com/api/v1/shares/pshare_7c6b5a49-3827-4615-9d0c-1b2a3c4d5e6f" \
-H "Authorization: Bearer $MESAKEM_API_KEY"{
"id": "pshare_7c6b5a49-3827-4615-9d0c-1b2a3c4d5e6f",
"object": "share",
"resource": {
"type": "meeting",
"id": "run_6f1c2a4e-0d3b-4e5f-9a7b-1c2d3e4f5a6b"
},
"status": "ready",
"share_url": "https://mesakem.com/s#…",
"created_at": "2026-10-16T09:00:00.000Z",
"revoked_at": null
}| Trial | Pro & organizations | |
|---|---|---|
| API access | Limited API — read-only | Full API |
| Active keys | 2 | 10 |
| Webhook endpoints | 1 (in Settings) | Up to 10 per person |
| Manage webhooks with the API (webhooks:write) | — | Included |
| Writes: bot, tasks, uploads and sharing | — | Included |
| Rooms: read | Included | Included |
| Rooms: create and edit | — | Included |
| Phone calls | Included | Included |
| Search | Included | Included |
| Summary templates: read | Included | Included |
| Summary templates: create and edit | — | Included |
The technical rate limits are the same on every plan and are listed under "Rate limits & best practices".