REST API reference

Zola API

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
Zola
Zola 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.

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

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

Parameters: list_guests
NameTypeDescription
list enum definitely_invited, maybe or all. Default: all.
include_contact boolean Add mailing address, email and phone. Default: false.
search string Match on guest name.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/zola/list_guests \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("zola", "list_guests")
Node.js
const result = await cotlet.call('zola', 'list_guests');
CLI
cotlet call zola list_guests

Example response

{
  "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"
        }
      ]
    }
  ]
}

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

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
curl -X POST https://cotlet.dev/api/v1/zola/list_events \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("zola", "list_events")
Node.js
const result = await cotlet.call('zola', 'list_events');
CLI
cotlet call zola list_events

Example response

{
  "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"
    }
  ]
}

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

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

Parameters: track_rsvps
NameTypeDescription
event_id required string Event ID from list_events.
status enum attending, declined, no_response or all. Default: all.

Request

cURL
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
result = client.call("zola", "track_rsvps", {"event_id":"evt_reception","status":"no_response"})
Node.js
const result = await cotlet.call('zola', 'track_rsvps', {"event_id":"evt_reception","status":"no_response"});
CLI
cotlet call zola track_rsvps --data '{"event_id":"evt_reception","status":"no_response"}'

Example response

{
  "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

read

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

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

Parameters: list_gifts
NameTypeDescription
thank_you enum sent, not_sent or all. Default: all.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/zola/list_gifts \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("zola", "list_gifts")
Node.js
const result = await cotlet.call('zola', 'list_gifts');
CLI
cotlet call zola list_gifts

Example response

{
  "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

write

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

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

Parameters: add_guest
NameTypeDescription
first_name required string Guest first name.
last_name required string Guest last name.
email string Guest email.
phone string Guest phone number.
plus_one object first_name and last_name of the plus-one, if known.
list enum definitely_invited or maybe. Default: definitely_invited.

Request

cURL
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
result = client.call("zola", "add_guest", {"first_name":"first name","last_name":"last name"})
Node.js
const result = await cotlet.call('zola', 'add_guest', {"first_name":"first name","last_name":"last name"});
CLI
cotlet call zola add_guest --data '{"first_name":"first name","last_name":"last name"}'

Example response

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

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

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

Parameters: update_guest_address
NameTypeDescription
guest_id required string Guest ID from list_guests.
address required object address_1, address_2, city, state_province, postal_code, country_code.

Request

cURL
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
result = client.call("zola", "update_guest_address", {"guest_id":"guest_8c41d2","address":"address"})
Node.js
const result = await cotlet.call('zola', 'update_guest_address', {"guest_id":"guest_8c41d2","address":"address"});
CLI
cotlet call zola update_guest_address --data '{"guest_id":"guest_8c41d2","address":"address"}'

Example response

{
  "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"
}

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

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

Parameters: invite_guest_to_event
NameTypeDescription
event_id required string Event ID from list_events.
guest_id required string Guest ID from list_guests.

Request

cURL
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
result = client.call("zola", "invite_guest_to_event", {"event_id":"event_8c41d2","guest_id":"guest_8c41d2"})
Node.js
const result = await cotlet.call('zola', 'invite_guest_to_event', {"event_id":"event_8c41d2","guest_id":"guest_8c41d2"});
CLI
cotlet call zola invite_guest_to_event --data '{"event_id":"event_8c41d2","guest_id":"guest_8c41d2"}'

Example response

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

Record RSVP

write

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

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

Parameters: record_rsvp
NameTypeDescription
event_id required string Event ID from list_events.
guest_id required string Guest ID from list_guests.
status required enum attending or declined.
meal_choice string One of the meal options set on the event.

Request

cURL
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
result = client.call("zola", "record_rsvp", {"event_id":"evt_reception","guest_id":"gst_a41c07","status":"attending","meal_choice":"Vegetarian"})
Node.js
const result = await cotlet.call('zola', 'record_rsvp', {"event_id":"evt_reception","guest_id":"gst_a41c07","status":"attending","meal_choice":"Vegetarian"});
CLI
cotlet call zola record_rsvp --data '{"event_id":"evt_reception","guest_id":"gst_a41c07","status":"attending","meal_choice":"Vegetarian"}'

Example response

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

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

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

Parameters: mark_mail_sent
NameTypeDescription
guest_id required string Guest ID from list_guests.
type required enum save_the_date or invitation.

Request

cURL
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
result = client.call("zola", "mark_mail_sent", {"guest_id":"guest_8c41d2","type":"save_the_date"})
Node.js
const result = await cotlet.call('zola', 'mark_mail_sent', {"guest_id":"guest_8c41d2","type":"save_the_date"});
CLI
cotlet call zola mark_mail_sent --data '{"guest_id":"guest_8c41d2","type":"save_the_date"}'

Example response

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

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

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

Parameters: mark_thank_you_sent
NameTypeDescription
gift_ids required string[] Gift IDs from list_gifts.
sent boolean false to undo. Default: true.

Request

cURL
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
result = client.call("zola", "mark_thank_you_sent", {"gift_ids":["gft_8f21c4","gft_8f21d9"],"sent":True})
Node.js
const result = await cotlet.call('zola', 'mark_thank_you_sent', {"gift_ids":["gft_8f21c4","gft_8f21d9"],"sent":true});
CLI
cotlet call zola mark_thank_you_sent --data '{"gift_ids":["gft_8f21c4","gft_8f21d9"],"sent":true}'

Example response

{
  "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"
    }
  ]
}