# Zola API

> Every Zola 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/zola

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)

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

- Base URL: `https://cotlet.dev/api/v1/zola`
- Connects with: Your own Zola couple account (email and password, or Google or Apple sign-in)
- Integration page: https://cotlet.dev/integrations/zola-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `list_guests` | read | Guests with their list (Definitely Invited or Maybe), events invited to and RSVP state. |
| `list_events` | read | Your wedding events with type, name, date and start time. |
| `track_rsvps` | read | RSVPs for one event: who is attending, declined or has not replied, with meal choices. |
| `list_gifts` | read | Gift tracker: each gift with giver, message, value, giver address, order status and thank-you note status. |
| `add_guest` | write | Add a guest, optionally with a plus-one, to your guest list. Nothing is sent to the guest. |
| `update_guest_address` | write | Set the mailing address used for Save the Dates and invitation envelopes. |
| `invite_guest_to_event` | write | Mark a guest as invited to an event, so they can RSVP to it on your wedding website. |
| `record_rsvp` | write | Record a reply you got by phone or mail: attending or declined, with meal choice. |
| `mark_mail_sent` | write | Track that a guest has received a Save the Date or an invitation. |
| `mark_thank_you_sent` | write | Mark the thank-you note for one or more gifts in the gift tracker as sent. |

## List guests

`POST https://cotlet.dev/api/v1/zola/list_guests`

Access: read.

Returns the guests on your guest list, each with the list they are on, the events they are invited to and their reply per event. Contact details are left out unless include_contact is true. Use guest_id from each item in the other tools.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `list` | enum | no | definitely_invited, maybe or all. Default: all. |
| `include_contact` | boolean | no | Add mailing address, email and phone. Default: false. |
| `search` | string | no | Match on guest name. |

### Request

**cURL**

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

**Python**

```python
result = client.call("zola", "list_guests")
```

**Node.js**

```js
const result = await cotlet.call('zola', 'list_guests');
```

**CLI**

```bash
cotlet call zola list_guests
```

### Example response

```json
{
  "guests": [
    {
      "guest_id": "gst_a41c07",
      "name": "Maria Example",
      "list": "definitely_invited",
      "events": [
        {
          "event_id": "evt_ceremony",
          "rsvp": "attending"
        },
        {
          "event_id": "evt_reception",
          "rsvp": "no_response"
        }
      ]
    },
    {
      "guest_id": "gst_a41c08",
      "name": "Tom Example",
      "list": "definitely_invited",
      "events": [
        {
          "event_id": "evt_ceremony",
          "rsvp": "declined"
        }
      ]
    }
  ]
}
```

## List events

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

Access: read.

Returns the events from "Your Events" in Zola: ceremony, reception, rehearsal dinner and any others you added. Use event_id from each item in the RSVP and invite tools. Guests can only RSVP to events they are invited to.

### Parameters

No parameters.

### Request

**cURL**

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

**Python**

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

**Node.js**

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

**CLI**

```bash
cotlet call zola list_events
```

### Example response

```json
{
  "events": [
    {
      "event_id": "evt_ceremony",
      "type": "Ceremony",
      "name": "Wedding Ceremony",
      "date": "2027-06-12",
      "start_time": "15:00"
    },
    {
      "event_id": "evt_reception",
      "type": "Reception",
      "name": "Dinner and Dancing",
      "date": "2027-06-12",
      "start_time": "18:00"
    }
  ]
}
```

## Track RSVPs

`POST https://cotlet.dev/api/v1/zola/track_rsvps`

Access: read.

Returns the replies for one event with each guest's status, meal choice and answers to the questions you added to the event. Online RSVPs from your wedding website and replies you recorded by hand are both included. Meal totals are counted from the attending guests.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `status` | enum | no | attending, declined, no_response or all. Default: all. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/zola/track_rsvps \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"evt_reception","status":"no_response"}'
```

**Python**

```python
result = client.call("zola", "track_rsvps", {"event_id":"evt_reception","status":"no_response"})
```

**Node.js**

```js
const result = await cotlet.call('zola', 'track_rsvps', {"event_id":"evt_reception","status":"no_response"});
```

**CLI**

```bash
cotlet call zola track_rsvps --data '{"event_id":"evt_reception","status":"no_response"}'
```

### Example response

```json
{
  "event_id": "evt_reception",
  "counts": {
    "attending": 2,
    "declined": 1,
    "no_response": 1
  },
  "meals": {
    "Chicken": 1,
    "Fish": 1
  },
  "rsvps": [
    {
      "guest_id": "gst_a41c07",
      "name": "Maria Example",
      "status": "attending",
      "meal_choice": "Chicken"
    },
    {
      "guest_id": "gst_a41c08",
      "name": "Tom Example",
      "status": "attending",
      "meal_choice": "Fish"
    },
    {
      "guest_id": "gst_a41c09",
      "name": "Ana Example",
      "status": "declined",
      "meal_choice": null
    },
    {
      "guest_id": "gst_a41c10",
      "name": "Sam Example",
      "status": "no_response",
      "meal_choice": null
    }
  ]
}
```

## List gifts

`POST https://cotlet.dev/api/v1/zola/list_gifts`

Access: read.

Returns the gifts in your gift tracker with the fields Zola's CSV download has: order number, name, quantity, value, gift message, giver's address, order status and thank-you note status. Use gift_id from each item in mark_thank_you_sent.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `thank_you` | enum | no | sent, not_sent or all. Default: all. |

### Request

**cURL**

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

**Python**

```python
result = client.call("zola", "list_gifts")
```

**Node.js**

```js
const result = await cotlet.call('zola', 'list_gifts');
```

**CLI**

```bash
cotlet call zola list_gifts
```

### Example response

```json
{
  "gifts": [
    {
      "gift_id": "gft_8f21c4",
      "order_number": "ZO-100412",
      "name": "Dutch Oven",
      "quantity": 1,
      "value": 389,
      "giver": "Alex Example",
      "message": "Congratulations!",
      "address": "12 Example Street, Springfield, IL 62701",
      "order_status": "delivered",
      "thank_you": "not_sent"
    },
    {
      "gift_id": "gft_8f21d9",
      "order_number": "ZO-100417",
      "name": "Honeymoon Fund",
      "quantity": 1,
      "value": 150,
      "giver": "Sam Example",
      "message": "Have a great trip.",
      "address": "4 Sample Road, Portland, OR 97201",
      "order_status": "completed",
      "thank_you": "not_sent"
    }
  ]
}
```

## Add guest

`POST https://cotlet.dev/api/v1/zola/add_guest`

Access: write.

Adds a guest to "Definitely Invited" or "Maybe" and returns the new guest_id. A plus-one is added as a second guest in the same party. Nothing is sent to anyone, so add_guest runs without asking first. Events are set with invite_guest_to_event.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `first_name` | string | yes | Guest first name. |
| `last_name` | string | yes | Guest last name. |
| `email` | string | no | Guest email. |
| `phone` | string | no | Guest phone number. |
| `plus_one` | object | no | first_name and last_name of the plus-one, if known. |
| `list` | enum | no | definitely_invited or maybe. Default: definitely_invited. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/zola/add_guest \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"first name","last_name":"last name"}'
```

**Python**

```python
result = client.call("zola", "add_guest", {"first_name":"first name","last_name":"last name"})
```

**Node.js**

```js
const result = await cotlet.call('zola', 'add_guest', {"first_name":"first name","last_name":"last name"});
```

**CLI**

```bash
cotlet call zola add_guest --data '{"first_name":"first name","last_name":"last name"}'
```

### Example response

```json
{
  "guest_id": "gst_b7720e",
  "name": "Maria Example",
  "list": "definitely_invited",
  "plus_one": {
    "guest_id": "gst_b7720f",
    "name": "Tom Example"
  },
  "status": "added"
}
```

## Update guest address

`POST https://cotlet.dev/api/v1/zola/update_guest_address`

Access: write.

Replaces the mailing address of one guest, the address shown on the "Address Envelopes" page. Nothing is sent to the guest, so it runs without asking first, and calling it again with the old address undoes it.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `guest_id` | string | yes | Guest ID from list_guests. |
| `address` | object | yes | address_1, address_2, city, state_province, postal_code, country_code. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/zola/update_guest_address \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"guest_id":"guest_8c41d2","address":"address"}'
```

**Python**

```python
result = client.call("zola", "update_guest_address", {"guest_id":"guest_8c41d2","address":"address"})
```

**Node.js**

```js
const result = await cotlet.call('zola', 'update_guest_address', {"guest_id":"guest_8c41d2","address":"address"});
```

**CLI**

```bash
cotlet call zola update_guest_address --data '{"guest_id":"guest_8c41d2","address":"address"}'
```

### Example response

```json
{
  "guest_id": "gst_a41c07",
  "address": {
    "address_1": "12 Example Street",
    "address_2": null,
    "city": "Springfield",
    "state_province": "IL",
    "postal_code": "62701",
    "country_code": "US"
  },
  "status": "updated"
}
```

## Invite guest to event

`POST https://cotlet.dev/api/v1/zola/invite_guest_to_event`

Access: write.

Adds an event to the events a guest is invited to, the choice you make on the "Invite Guests to Events" tab. Guests can only RSVP to events they are invited to. It sends no message, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `guest_id` | string | yes | Guest ID from list_guests. |

### Request

**cURL**

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

**Python**

```python
result = client.call("zola", "invite_guest_to_event", {"event_id":"event_8c41d2","guest_id":"guest_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('zola', 'invite_guest_to_event', {"event_id":"event_8c41d2","guest_id":"guest_8c41d2"});
```

**CLI**

```bash
cotlet call zola invite_guest_to_event --data '{"event_id":"event_8c41d2","guest_id":"guest_8c41d2"}'
```

### Example response

```json
{
  "guest_id": "gst_a41c07",
  "event_id": "evt_reception",
  "invited": true
}
```

## Record RSVP

`POST https://cotlet.dev/api/v1/zola/record_rsvp`

Access: write.

Records the reply of one guest to one event, the same as entering it under "Track RSVPs". The guest must be invited to the event, and meal_choice must be one of the options set on it. It changes only your own records and one more call corrects it, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | Event ID from list_events. |
| `guest_id` | string | yes | Guest ID from list_guests. |
| `status` | enum | yes | attending or declined. |
| `meal_choice` | string | no | One of the meal options set on the event. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/zola/record_rsvp \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"evt_reception","guest_id":"gst_a41c07","status":"attending","meal_choice":"Vegetarian"}'
```

**Python**

```python
result = client.call("zola", "record_rsvp", {"event_id":"evt_reception","guest_id":"gst_a41c07","status":"attending","meal_choice":"Vegetarian"})
```

**Node.js**

```js
const result = await cotlet.call('zola', 'record_rsvp', {"event_id":"evt_reception","guest_id":"gst_a41c07","status":"attending","meal_choice":"Vegetarian"});
```

**CLI**

```bash
cotlet call zola record_rsvp --data '{"event_id":"evt_reception","guest_id":"gst_a41c07","status":"attending","meal_choice":"Vegetarian"}'
```

### Example response

```json
{
  "guest_id": "gst_a41c07",
  "event_id": "evt_reception",
  "status": "attending",
  "meal_choice": "Vegetarian",
  "recorded": true
}
```

## Mark mail sent

`POST https://cotlet.dev/api/v1/zola/mark_mail_sent`

Access: write.

Updates the mail tracking on the "Address Envelopes" page for one guest. It does not mail anything and reaches no one, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `guest_id` | string | yes | Guest ID from list_guests. |
| `type` | enum | yes | save_the_date or invitation. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/zola/mark_mail_sent \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"guest_id":"guest_8c41d2","type":"save_the_date"}'
```

**Python**

```python
result = client.call("zola", "mark_mail_sent", {"guest_id":"guest_8c41d2","type":"save_the_date"})
```

**Node.js**

```js
const result = await cotlet.call('zola', 'mark_mail_sent', {"guest_id":"guest_8c41d2","type":"save_the_date"});
```

**CLI**

```bash
cotlet call zola mark_mail_sent --data '{"guest_id":"guest_8c41d2","type":"save_the_date"}'
```

### Example response

```json
{
  "guest_id": "gst_a41c07",
  "type": "save_the_date",
  "mailed": true
}
```

## Mark thank-you sent

`POST https://cotlet.dev/api/v1/zola/mark_thank_you_sent`

Access: write.

Sets the thank-you note status of the gifts you pass, as the gift tracker does for one gift at a time. Set sent to false to undo. It changes only your tracker and nothing goes to the giver, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `gift_ids` | string[] | yes | Gift IDs from list_gifts. |
| `sent` | boolean | no | false to undo. Default: true. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/zola/mark_thank_you_sent \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"gift_ids":["gft_8f21c4","gft_8f21d9"],"sent":true}'
```

**Python**

```python
result = client.call("zola", "mark_thank_you_sent", {"gift_ids":["gft_8f21c4","gft_8f21d9"],"sent":True})
```

**Node.js**

```js
const result = await cotlet.call('zola', 'mark_thank_you_sent', {"gift_ids":["gft_8f21c4","gft_8f21d9"],"sent":true});
```

**CLI**

```bash
cotlet call zola mark_thank_you_sent --data '{"gift_ids":["gft_8f21c4","gft_8f21d9"],"sent":true}'
```

### Example response

```json
{
  "updated": [
    {
      "gift_id": "gft_8f21c4",
      "gift": "Dutch Oven",
      "giver": "Alex Example",
      "thank_you": "sent"
    },
    {
      "gift_id": "gft_8f21d9",
      "gift": "Honeymoon Fund",
      "giver": "Sam Example",
      "thank_you": "sent"
    }
  ]
}
```
