> ## Documentation Index
> Fetch the complete documentation index at: https://docs.helpgenie.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Genie Meetings

> Send a genie to an online meeting as a notetaker and read the summary, action items and transcript it brings back

A genie can join a Google Meet, Zoom or Microsoft Teams meeting under its own name and avatar, take notes, and bring back a summary, action items and a full transcript. Completed meetings are saved as an Inbox conversation (type `meeting`) and can optionally be emailed to the genie owner or added to the genie's knowledge base.

Every action requires access to the meeting's genie (owner, teammate with access, or admin).

### Meeting states

| State | Meaning |
| - | - |
| `scheduled` | Booked to join at `join_time`. |
| `joining` | On its way into the meeting. |
| `waiting` | In the lobby, waiting to be admitted. Gives up after 10 minutes. |
| `in_meeting` | In the meeting, recording and transcribing. |
| `processing` | Meeting over, notes being prepared. |
| `completed` | Notes ready. |
| `failed` | Something went wrong — see `failure_reason`. |
| `cancelled` | Cancelled before the genie was admitted. |

### Limits

* One live meeting per genie, and up to 10 scheduled meetings per genie.
* 600 meeting minutes per account per calendar month (UTC), counted across all of the owner's genies. Admins are exempt.
* The genie leaves on its own when the meeting ends or after 60 seconds of unbroken silence. What it captured is still turned into notes.

***

## List meetings

Lists a genie's meetings, newest first, with state, summary and action items. Transcripts are not included — use [Get meeting](#get-meeting).

**resource** `string` *required*

`genie-meetings`

**action** `string` *required*

`list`

**data** `object` *required*

**properties**

**agentId** `string` *required*

UUID of the genie.

**limit** `number` (default: 25)

Maximum number of meetings to return. Maximum `100`.

```typescript Request theme={null}
const response = await ApiService.invoke({
  resource: "genie-meetings",
  action: "list",
  data: {
    agentId: "agent-uuid",
    limit: 25,
  },
});
```

```bash cURL theme={null}
curl -X POST https://api.helpgenie.ai/v1 \
  -H "Authorization: Bearer hg_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "genie-meetings",
    "action": "list",
    "data": {
      "agentId": "agent-uuid",
      "limit": 25
    }
  }'
```

### Response

**meetings** `Meeting[]`

Array of meeting objects.

**Meeting object**

**id** `string`

Unique meeting identifier.

**agent\_id** `string`

ID of the genie sent to the meeting.

**user\_id** `string`

ID of the genie's owner. Meeting minutes count against this account.

**meeting\_link** `string`

The meeting link the genie joins.

**meeting\_provider** `string`

`google_meet`, `zoom` or `teams`, detected from the link.

**title** `string | null`

What the meeting is about.

**join\_time** `string | null`

ISO 8601 scheduled join time. `null` when the genie was sent to join immediately.

**state** `string`

One of the [meeting states](#meeting-states).

**failure\_reason** `string | null`

Why the meeting failed, when `state` is `failed` (for example `force_stopped`).

**started\_at** `string | null`

ISO 8601 timestamp of when the genie entered the meeting.

**ended\_at** `string | null`

ISO 8601 timestamp of when the genie left the meeting.

**duration\_secs** `number | null`

Time spent in the meeting, in seconds.

**summary** `string | null`

Meeting summary, once the notes are ready.

**action\_items** `string[] | null`

Action items from the meeting, once the notes are ready.

**document\_id** `string | null`

Knowledge-base document created from the notes, set once [Add to knowledge](#add-to-knowledge) succeeds.

**conversation\_id** `number | null`

The Inbox conversation (type `meeting`) the notes were written to once completed. See [Conversations](/api-reference/conversations).

**email\_notes** `boolean`

Whether the genie owner is emailed the summary and action items once the notes are ready.

**created\_at** `string`

ISO 8601 creation timestamp.

**updated\_at** `string`

ISO 8601 timestamp of the last change.

***

## Get meeting

Returns one meeting with its full transcript and its activity — every step that happened, oldest first. Use the activity to explain why a genie has not joined yet or why a meeting failed.

**resource** `string` *required*

`genie-meetings`

**action** `string` *required*

`get`

**id** `string` *required*

The meeting ID.

```typescript Request theme={null}
const response = await ApiService.invoke({
  resource: "genie-meetings",
  action: "get",
  id: "meeting-uuid",
});
```

```bash cURL theme={null}
curl -X POST https://api.helpgenie.ai/v1 \
  -H "Authorization: Bearer hg_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "genie-meetings",
    "action": "get",
    "id": "meeting-uuid"
  }'
```

### Response

**meeting** `object`

The [meeting object](#list-meetings), plus:

**properties**

**transcript** `object[]`

Transcript segments in order. Empty when no transcript is available.

**Segment**

**speaker** `string | null`

Speaker name.

**start\_ms** `number | null`

Segment start, in milliseconds from the start of the recording.

**end\_ms** `number | null`

Segment end, in milliseconds from the start of the recording.

**text** `string`

What was said.

**events** `object[]`

The meeting's activity, oldest first.

**Event**

**id** `string`

Event ID.

**kind** `string`

What happened. Platform steps: `sent`, `scheduled`, `cancelled`, `leave_requested`, `force_stopped`, `notes_saved`, `no_notes`, `analysis_failed`, `conversation_created`, `conversation_failed`, `email_sent`, `email_failed`, `error`. Notetaker notifications: `notetaker.meeting_state`, `notetaker.media`, `notetaker.deleted`.

**state** `string | null`

Raw notetaker state reported with a notification.

**meeting\_state** `string | null`

Raw meeting state reported with a notification, for example `waiting_for_entry` or `entry_denied`.

**detail** `string | null`

Extra detail, such as the scheduled join time or an error message.

**created\_at** `string`

ISO 8601 timestamp.

***

## Send to a meeting

Sends the genie to a meeting now, or schedules it to join at a set time. The genie joins under its own name and avatar and tells the meeting it is recording and transcribing. A meeting restricted to an organization needs someone to admit the genie.

**resource** `string` *required*

`genie-meetings`

**action** `string` *required*

`send`

**data** `object` *required*

**properties**

**agentId** `string` *required*

UUID of the genie to send.

**meetingLink** `string` *required*

An `https` link on `meet.google.com`, `zoom.us`, `teams.microsoft.com` or `teams.live.com`.

**joinTime** `string`

ISO 8601 date-time to join. Omit to join now. Must be between 2 minutes and 60 days ahead.

**title** `string`

What the meeting is about. Maximum 120 characters.

**emailNotes** `boolean` (default: false)

Email the summary and action items to the genie owner once the notes are ready.

```typescript Request theme={null}
const response = await ApiService.invoke({
  resource: "genie-meetings",
  action: "send",
  data: {
    agentId: "agent-uuid",
    meetingLink: "https://meet.google.com/abc-defg-hij",
    joinTime: "2026-10-20T15:00:00Z",
    title: "Weekly customer review",
    emailNotes: true,
  },
});
```

```bash cURL theme={null}
curl -X POST https://api.helpgenie.ai/v1 \
  -H "Authorization: Bearer hg_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "genie-meetings",
    "action": "send",
    "data": {
      "agentId": "agent-uuid",
      "meetingLink": "https://meet.google.com/abc-defg-hij",
      "joinTime": "2026-10-20T15:00:00Z",
      "title": "Weekly customer review",
      "emailNotes": true
    }
  }'
```

### Response

**meeting** `object`

The new [meeting object](#list-meetings), with `state` `joining` (join now) or `scheduled`.

> [!NOTE]
>
> Returns `CONFLICT` when the genie is already booked for the same link, or is already in a meeting and you asked it to join now. Returns `VALIDATION_ERROR` when the genie already has 10 meetings scheduled, and `RATE_LIMIT_EXCEEDED` when the account has used its 600 meeting minutes for the month.

***

## Cancel meeting

Cancels a meeting the genie has not been admitted to yet (`scheduled`, `joining` or `waiting`). For a genie already in the meeting, use [Leave meeting](#leave-meeting).

**resource** `string` *required*

`genie-meetings`

**action** `string` *required*

`cancel`

**id** `string` *required*

The meeting ID.

```typescript Request theme={null}
const response = await ApiService.invoke({
  resource: "genie-meetings",
  action: "cancel",
  id: "meeting-uuid",
});
```

```bash cURL theme={null}
curl -X POST https://api.helpgenie.ai/v1 \
  -H "Authorization: Bearer hg_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "genie-meetings",
    "action": "cancel",
    "id": "meeting-uuid"
  }'
```

### Response

**meeting** `object`

The updated [meeting object](#list-meetings), with `state` `cancelled`.

***

## Leave meeting

Pulls the genie out of a meeting it is in (`in_meeting`). What it captured so far is still turned into notes: the meeting moves to `processing` and then `completed` on its own.

**resource** `string` *required*

`genie-meetings`

**action** `string` *required*

`leave`

**id** `string` *required*

The meeting ID.

```typescript Request theme={null}
const response = await ApiService.invoke({
  resource: "genie-meetings",
  action: "leave",
  id: "meeting-uuid",
});
```

```bash cURL theme={null}
curl -X POST https://api.helpgenie.ai/v1 \
  -H "Authorization: Bearer hg_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "genie-meetings",
    "action": "leave",
    "id": "meeting-uuid"
  }'
```

### Response

**ok** `boolean`

`true` once the leave request was sent.

***

## Force stop

Last resort when the genie was asked to leave and is still shown in the meeting. Removes the genie from the meeting and closes the meeting as `failed` with `failure_reason` `force_stopped`.

Only allowed for a meeting in `in_meeting` that was asked to [leave](#leave-meeting) 3 times, or whose first leave request is at least 2 minutes old. Otherwise returns `CONFLICT`.

**resource** `string` *required*

`genie-meetings`

**action** `string` *required*

`force-stop`

**id** `string` *required*

The meeting ID.

```typescript Request theme={null}
const response = await ApiService.invoke({
  resource: "genie-meetings",
  action: "force-stop",
  id: "meeting-uuid",
});
```

```bash cURL theme={null}
curl -X POST https://api.helpgenie.ai/v1 \
  -H "Authorization: Bearer hg_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "genie-meetings",
    "action": "force-stop",
    "id": "meeting-uuid"
  }'
```

### Response

**ok** `boolean`

`true` once the genie was stopped. If the meeting ended on its own while the genie was being stopped, that outcome is kept and the meeting is not marked `force_stopped`; the response is still `true`.

> [!WARNING]
>
> Anything recorded is lost and no notes are made.

***

## Add to knowledge

Adds a completed meeting's notes to its genie's knowledge base as one document — everything, or only the parts you pick and edit. The document belongs to the genie's owner even when a teammate adds it.

> [!NOTE]
>
> Never automatic. A genie repeats what it knows to customers, so confirm the notes are safe to share, and use `parts` to leave out small talk or internal remarks.

Only `completed` meetings can be added, and each only once.

**resource** `string` *required*

`genie-meetings`

**action** `string` *required*

`add-to-knowledge`

**id** `string` *required*

The meeting ID.

**data** `object`

**properties**

**parts** `object`

The parts of the notes to add, as edited. Only parts that are sent and not empty go in. Omit to add the whole summary, action items and transcript.

**properties**

**summary** `string`

Meeting summary.

**actionItems** `string[]`

Action items.

**transcript** `string`

Transcript as plain text.

```typescript Request theme={null}
const response = await ApiService.invoke({
  resource: "genie-meetings",
  action: "add-to-knowledge",
  id: "meeting-uuid",
  data: {
    parts: {
      summary: "Agreed the new onboarding flow and pricing page copy.",
      actionItems: ["Publish the pricing page by Friday"],
    },
  },
});
```

```bash cURL theme={null}
curl -X POST https://api.helpgenie.ai/v1 \
  -H "Authorization: Bearer hg_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "genie-meetings",
    "action": "add-to-knowledge",
    "id": "meeting-uuid",
    "data": {
      "parts": {
        "summary": "Agreed the new onboarding flow and pricing page copy.",
        "actionItems": ["Publish the pricing page by Friday"]
      }
    }
  }'
```

### Response

**meeting** `object`

The updated [meeting object](#list-meetings), with `document_id` set.

***

## Delete meeting

Deletes a meeting, its stored transcript and its Inbox conversation. Not allowed while the genie is joining, waiting in the lobby or in the meeting — cancel it or ask it to leave first. A knowledge-base document created from the meeting is kept.

**resource** `string` *required*

`genie-meetings`

**action** `string` *required*

`delete`

**id** `string` *required*

The meeting ID.

```typescript Request theme={null}
const response = await ApiService.invoke({
  resource: "genie-meetings",
  action: "delete",
  id: "meeting-uuid",
});
```

```bash cURL theme={null}
curl -X POST https://api.helpgenie.ai/v1 \
  -H "Authorization: Bearer hg_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "genie-meetings",
    "action": "delete",
    "id": "meeting-uuid"
  }'
```

### Response

**ok** `boolean`

`true` if the meeting was deleted.

> [!WARNING]
>
> This action is permanent and cannot be undone.

***

## Meeting usage

Returns the meeting minutes the genie owner's account has used this calendar month (UTC), and the monthly cap. Counted per account across all of the owner's genies. In-browser recordings from a listener genie's live page are not counted.

**resource** `string` *required*

`genie-meetings`

**action** `string` *required*

`usage`

**data** `object` *required*

**properties**

**agentId** `string` *required*

UUID of any genie on the account.

```typescript Request theme={null}
const response = await ApiService.invoke({
  resource: "genie-meetings",
  action: "usage",
  data: { agentId: "agent-uuid" },
});
```

```bash cURL theme={null}
curl -X POST https://api.helpgenie.ai/v1 \
  -H "Authorization: Bearer hg_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "genie-meetings",
    "action": "usage",
    "data": { "agentId": "agent-uuid" }
  }'
```

### Response

**minutesUsed** `number`

Minutes used this month, rounded up.

**minutesCap** `number`

Monthly cap (`600`).

***

## List all meetings (admin)

Admin only. Every genie meeting on the platform, newest first, with its genie and owner, for reviewing and debugging meetings.

**resource** `string` *required*

`genie-meetings`

**action** `string` *required*

`admin-list`

**data** `object`

**properties**

**state** `string`

Filter by one of the [meeting states](#meeting-states).

**search** `string`

Matches the meeting title or link, the genie name, or the owner's name or email.

**limit** `number` (default: 50)

Maximum number of meetings to return. Maximum `200`.

**offset** `number` (default: 0)

Number of meetings to skip.

```typescript Request theme={null}
const response = await ApiService.invoke({
  resource: "genie-meetings",
  action: "admin-list",
  data: { state: "failed", limit: 50, offset: 0 },
});
```

```bash cURL theme={null}
curl -X POST https://api.helpgenie.ai/v1 \
  -H "Authorization: Bearer hg_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "genie-meetings",
    "action": "admin-list",
    "data": { "state": "failed", "limit": 50, "offset": 0 }
  }'
```

### Response

**meetings** `object[]`

[Meeting objects](#list-meetings), each with `agent_name`, `owner_email` and `owner_name` added.

**count** `number`

Total number of matching meetings.

**limit** `number`

Page size used.

**offset** `number`

Offset used.

***

## Notetaker history (admin)

Admin only. The meeting notetaker's own history, as the notetaker service returns it, to compare against the activity in [Get meeting](#get-meeting).

**resource** `string` *required*

`genie-meetings`

**action** `string` *required*

`admin-history`

**id** `string` *required*

The meeting ID.

```typescript Request theme={null}
const response = await ApiService.invoke({
  resource: "genie-meetings",
  action: "admin-history",
  id: "meeting-uuid",
});
```

```bash cURL theme={null}
curl -X POST https://api.helpgenie.ai/v1 \
  -H "Authorization: Bearer hg_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "resource": "genie-meetings",
    "action": "admin-history",
    "id": "meeting-uuid"
  }'
```

### Response

**found** `boolean`

`false` when the meeting never got a notetaker or its history is no longer available (a completed meeting's notetaker is removed once its notes are saved).

**history** `object | null`

The notetaker history, unmodified. `null` when `found` is `false`.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.