# Whova API

> Every Whova endpoint on Cotlet: inputs, JSON Schema, cURL, Python and Node.js examples and an example response for each call.

Source: https://cotlet.dev/docs/api/whova

Docs sections: [Get started](https://cotlet.dev/docs.md) · [REST API](https://cotlet.dev/docs/api.md) · [MCP](https://cotlet.dev/docs/mcp.md) · [SDKs & CLI](https://cotlet.dev/docs/sdks.md) · [Integrations](https://cotlet.dev/docs/integrations.md)

11 endpoints for Whova. Each one is a POST with a JSON body, called with your API key.

- Base URL: `https://cotlet.dev/api/v1/whova`
- Connects with: Your own Whova organizer account for the event
- Integration page: https://cotlet.dev/integrations/whova-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `list_events` | read | Events you can manage as an organizer, with dates and status. |
| `list_attendees` | read | Attendees of an event with email, company, ticket type, audience type and check-in status. |
| `list_registrations` | read | Registration orders with registrant, ticket type and order date, newest first. |
| `list_sessions` | read | Agenda sessions with time, tracks, speakers and description, in agenda order. |
| `list_speakers` | read | Speakers of an event from the Speaker Center, with their sessions. |
| `get_post_event_report` | read | The post-event report of an event as text sections, available after the event ends. |
| `add_session` | write | Add a session to the agenda in Session Manager. |
| `update_session` | write | Change the time, tracks, speakers or description of an existing session. |
| `add_attendee` | write | Create or update one attendee by name and email. |
| `send_announcement` | write | Post an announcement for the attendees of an event. |
| `message_speakers` | write | Email all speakers of an event, or the ones you list, through Whova. |

## List events

`POST https://cotlet.dev/api/v1/whova/list_events`

Access: read.

Returns every event of your organizer account, newest first. Use event_id from each item in the other tools. Dates are in the time zone of the event.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | enum | no | upcoming, past or all. Default: upcoming. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/whova/list_events \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("whova", "list_events")
```

**Node.js**

```js
const result = await cotlet.call('whova', 'list_events');
```

**CLI**

```bash
cotlet call whova list_events
```

### Example response

```json
{
  "events": [
    {
      "event_id": "284611",
      "name": "Northwind Summit 2026",
      "start": "2026-10-21",
      "end": "2026-10-23",
      "status": "upcoming"
    },
    {
      "event_id": "271905",
      "name": "Northwind Summit 2025",
      "start": "2025-10-14",
      "end": "2025-10-16",
      "status": "past"
    }
  ]
}
```

## List attendees

`POST https://cotlet.dev/api/v1/whova/list_attendees`

Access: read.

Lists attendees of one event. Filter by ticket type or audience type, or by check-in status to see who has not arrived. Pages hold up to 500 attendees; pass next_cursor back as cursor for the next page.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `ticket_type` | string | no | Only holders of this ticket type, as named in your event. |
| `audience_type` | string | no | Only attendees with this audience type, as named in your event. |
| `checked_in` | boolean | no | true for checked-in attendees, false for those not checked in. |
| `limit` | integer | no | 1 to 500. Default: 100. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/whova/list_attendees \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("whova", "list_attendees", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('whova', 'list_attendees', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call whova list_attendees --data '{"event_id":"event_8c41d2"}'
```

### Example response

```json
{
  "attendees": [
    {
      "attendee_id": "at_5521",
      "first_name": "Maya",
      "last_name": "Ortiz",
      "email": "maya@example.com",
      "company": "Northwind Labs",
      "ticket_type": "Full Pass",
      "audience_type": "Attendee",
      "checked_in": false
    }
  ],
  "next_cursor": null
}
```

## List registrations

`POST https://cotlet.dev/api/v1/whova/list_registrations`

Access: read.

Lists registration orders of one event, newest first. Filter by date or ticket type to get only what is new since your last check. Pages hold up to 500 orders; pass next_cursor back as cursor.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `since` | date | no | Only orders placed on or after this date. |
| `ticket_type` | string | no | Only orders with this ticket type. |
| `limit` | integer | no | 1 to 500. Default: 100. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/whova/list_registrations \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("whova", "list_registrations", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('whova', 'list_registrations', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call whova list_registrations --data '{"event_id":"event_8c41d2"}'
```

### Example response

```json
{
  "orders": [
    {
      "order_id": "ord_80231",
      "registrant": "Maya Ortiz",
      "email": "maya@example.com",
      "ticket_type": "Full Pass",
      "ordered_at": "2026-10-10T14:12:00Z"
    },
    {
      "order_id": "ord_80229",
      "registrant": "Leo Brandt",
      "email": "leo@example.com",
      "ticket_type": "Student",
      "ordered_at": "2026-10-10T09:40:00Z"
    }
  ],
  "next_cursor": null
}
```

## List sessions

`POST https://cotlet.dev/api/v1/whova/list_sessions`

Access: read.

Lists the sessions of one event in agenda order. Filter by day or track. Use session_id with update_session. Times carry the time zone of the event.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `date` | date | no | Only sessions on this day. |
| `track` | string | no | Only sessions in this track. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/whova/list_sessions \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("whova", "list_sessions", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('whova', 'list_sessions', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call whova list_sessions --data '{"event_id":"event_8c41d2"}'
```

### Example response

```json
{
  "sessions": [
    {
      "session_id": "s_30871",
      "title": "Breakout: Pricing workshop",
      "start": "2026-10-22T14:00:00-07:00",
      "end": "2026-10-22T15:00:00-07:00",
      "tracks": [
        "Workshops"
      ],
      "speakers": [
        "Jon Pike"
      ]
    }
  ]
}
```

## List speakers

`POST https://cotlet.dev/api/v1/whova/list_speakers`

Access: read.

Lists the speakers of one event with the sessions each one speaks in. Speakers added to a session appear here automatically. Use it to build the recipient list for message_speakers.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `session_id` | string | no | Only speakers of this session. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/whova/list_speakers \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
```

**Python**

```python
result = client.call("whova", "list_speakers", {"event_id":"event_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('whova', 'list_speakers', {"event_id":"event_8c41d2"});
```

**CLI**

```bash
cotlet call whova list_speakers --data '{"event_id":"event_8c41d2"}'
```

### Example response

```json
{
  "speakers": [
    {
      "speaker_id": "sp_204",
      "name": "Dana Reyes",
      "email": "dana@example.com",
      "sessions": [
        "Opening keynote"
      ]
    }
  ]
}
```

## Get post-event report

`POST https://cotlet.dev/api/v1/whova/get_post_event_report`

Access: read.

Returns the post-event report of one finished event as titled sections with their figures. Pass section to read one part, for example Sponsors and exhibitors. Whova releases the report only after the organizer requests it under Tools > Report; until then the call fails with a not-ready error.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `section` | string | no | Section title as shown in the report. Default: all sections. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/whova/get_post_event_report \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"271905","section":"Sponsors and exhibitors"}'
```

**Python**

```python
result = client.call("whova", "get_post_event_report", {"event_id":"271905","section":"Sponsors and exhibitors"})
```

**Node.js**

```js
const result = await cotlet.call('whova', 'get_post_event_report', {"event_id":"271905","section":"Sponsors and exhibitors"});
```

**CLI**

```bash
cotlet call whova get_post_event_report --data '{"event_id":"271905","section":"Sponsors and exhibitors"}'
```

### Example response

```json
{
  "event_id": "271905",
  "sections": [
    {
      "title": "Sponsors and exhibitors",
      "text": "Total sponsor impressions, exhibitor leads and attendee profile views, then impressions per sponsor."
    }
  ]
}
```

## Add session

`POST https://cotlet.dev/api/v1/whova/add_session`

Access: write.

Creates one session in the agenda of one event. Speakers you name also appear in the Speaker Center. The session shows in the event app agenda at once. It reaches no one directly and one update_session or a delete in Whova undoes it, so it runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `title` | string | yes | Session title. |
| `start` | datetime | yes | Start, ISO 8601 with time zone. |
| `end` | datetime | yes | End, ISO 8601 with time zone. |
| `tracks` | string[] | no | Tracks the session belongs to, as named in your event. |
| `speakers` | string[] | no | Speaker names. |
| `description` | string | no | Session description. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/whova/add_session \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2","title":"title","start":"2026-10-01T09:00:00Z","end":"2026-10-01T09:00:00Z"}'
```

**Python**

```python
result = client.call("whova", "add_session", {"event_id":"event_8c41d2","title":"title","start":"2026-10-01T09:00:00Z","end":"2026-10-01T09:00:00Z"})
```

**Node.js**

```js
const result = await cotlet.call('whova', 'add_session', {"event_id":"event_8c41d2","title":"title","start":"2026-10-01T09:00:00Z","end":"2026-10-01T09:00:00Z"});
```

**CLI**

```bash
cotlet call whova add_session --data '{"event_id":"event_8c41d2","title":"title","start":"2026-10-01T09:00:00Z","end":"2026-10-01T09:00:00Z"}'
```

### Example response

```json
{
  "session_id": "s_30902",
  "event_id": "284611",
  "title": "Opening keynote",
  "start": "2026-10-21T09:00:00-07:00",
  "end": "2026-10-21T09:45:00-07:00",
  "tracks": [
    "Main stage"
  ],
  "speakers": [
    "Dana Reyes"
  ],
  "status": "created"
}
```

## Update session

`POST https://cotlet.dev/api/v1/whova/update_session`

Access: write.

Changes the fields you send and leaves the others as they are. Moving a block of sessions means one call per session. It reaches no one directly and one more call restores the old values, so it runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `session_id` | string | yes | Session ID from list_sessions. |
| `title` | string | no | New title. |
| `start` | datetime | no | New start, ISO 8601 with time zone. |
| `end` | datetime | no | New end, ISO 8601 with time zone. |
| `tracks` | string[] | no | Replaces the tracks. |
| `speakers` | string[] | no | Replaces the speakers. |
| `description` | string | no | New description. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/whova/update_session \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"284611","session_id":"s_30871","start":"2026-10-22T15:00:00-07:00","end":"2026-10-22T16:00:00-07:00"}'
```

**Python**

```python
result = client.call("whova", "update_session", {"event_id":"284611","session_id":"s_30871","start":"2026-10-22T15:00:00-07:00","end":"2026-10-22T16:00:00-07:00"})
```

**Node.js**

```js
const result = await cotlet.call('whova', 'update_session', {"event_id":"284611","session_id":"s_30871","start":"2026-10-22T15:00:00-07:00","end":"2026-10-22T16:00:00-07:00"});
```

**CLI**

```bash
cotlet call whova update_session --data '{"event_id":"284611","session_id":"s_30871","start":"2026-10-22T15:00:00-07:00","end":"2026-10-22T16:00:00-07:00"}'
```

### Example response

```json
{
  "session_id": "s_30871",
  "event_id": "284611",
  "title": "Breakout: Pricing workshop",
  "start": "2026-10-22T15:00:00-07:00",
  "end": "2026-10-22T16:00:00-07:00",
  "status": "updated"
}
```

## Add attendee

`POST https://cotlet.dev/api/v1/whova/add_attendee`

Access: write. Confirm: waits for the user's OK before it runs.

Creates the attendee, or updates the one with the same email. The attendee appears in the event's attendee list. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `first_name` | string | yes | First name. |
| `last_name` | string | yes | Last name. |
| `email` | string | yes | Attendee email. |
| `company` | string | no | Company or organization. |
| `title` | string | no | Job title. |
| `ticket_type` | string | no | Ticket type, as named in your event. |
| `audience_type` | string | no | Audience type, as named in your event. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/whova/add_attendee \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2","first_name":"first name","last_name":"last name","email":"jane@example.com"}'
```

**Python**

```python
result = client.call("whova", "add_attendee", {"event_id":"event_8c41d2","first_name":"first name","last_name":"last name","email":"jane@example.com"})
```

**Node.js**

```js
const result = await cotlet.call('whova', 'add_attendee', {"event_id":"event_8c41d2","first_name":"first name","last_name":"last name","email":"jane@example.com"});
```

**CLI**

```bash
cotlet call whova add_attendee --data '{"event_id":"event_8c41d2","first_name":"first name","last_name":"last name","email":"jane@example.com"}'
```

### Example response

```json
{
  "attendee_id": "at_5530",
  "event_id": "284611",
  "email": "sam@example.com",
  "status": "created"
}
```

## Send announcement

`POST https://cotlet.dev/api/v1/whova/send_announcement`

Access: write. Confirm: waits for the user's OK before it runs.

Posts an announcement to the attendees of one event. App users get it as a push notification, and Whova also connects announcements to attendees' email, so people without the app are notified. It reaches every attendee at once. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `message` | string | yes | Announcement text. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/whova/send_announcement \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"284611","message":"The opening keynote has moved to Hall B. Doors open at 8:45."}'
```

**Python**

```python
result = client.call("whova", "send_announcement", {"event_id":"284611","message":"The opening keynote has moved to Hall B. Doors open at 8:45."})
```

**Node.js**

```js
const result = await cotlet.call('whova', 'send_announcement', {"event_id":"284611","message":"The opening keynote has moved to Hall B. Doors open at 8:45."});
```

**CLI**

```bash
cotlet call whova send_announcement --data '{"event_id":"284611","message":"The opening keynote has moved to Hall B. Doors open at 8:45."}'
```

### Example response

```json
{
  "announcement_id": "ann_90314",
  "event_id": "284611",
  "status": "sent"
}
```

## Message speakers

`POST https://cotlet.dev/api/v1/whova/message_speakers`

Access: write. Confirm: waits for the user's OK before it runs.

Sends an email to speakers through Whova's speaker messaging. Leave speaker_ids out to email all speakers of the event. Speakers receive it from Whova, not from your own address. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `subject` | string | yes | Email subject. |
| `body` | string | yes | Email body. |
| `speaker_ids` | string[] | no | Speaker IDs from list_speakers. Default: all speakers. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/whova/message_speakers \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"284611","subject":"Your session at Northwind Summit: 21 Oct, 9:00 AM","body":"Hi Dana, you open the summit with the keynote on 21 Oct, 9:00 to 9:45 AM on the Main stage. Please keep the talk to 40 minutes plus 5 for questions.","speaker_ids":["sp_204"]}'
```

**Python**

```python
result = client.call("whova", "message_speakers", {"event_id":"284611","subject":"Your session at Northwind Summit: 21 Oct, 9:00 AM","body":"Hi Dana, you open the summit with the keynote on 21 Oct, 9:00 to 9:45 AM on the Main stage. Please keep the talk to 40 minutes plus 5 for questions.","speaker_ids":["sp_204"]})
```

**Node.js**

```js
const result = await cotlet.call('whova', 'message_speakers', {"event_id":"284611","subject":"Your session at Northwind Summit: 21 Oct, 9:00 AM","body":"Hi Dana, you open the summit with the keynote on 21 Oct, 9:00 to 9:45 AM on the Main stage. Please keep the talk to 40 minutes plus 5 for questions.","speaker_ids":["sp_204"]});
```

**CLI**

```bash
cotlet call whova message_speakers --data '{"event_id":"284611","subject":"Your session at Northwind Summit: 21 Oct, 9:00 AM","body":"Hi Dana, you open the summit with the keynote on 21 Oct, 9:00 to 9:45 AM on the Main stage. Please keep the talk to 40 minutes plus 5 for questions.","speaker_ids":["sp_204"]}'
```

### Example response

```json
{
  "message_id": "msg_4107",
  "event_id": "284611",
  "recipients": 18,
  "status": "sent"
}
```
