REST API reference

Paperless Post API

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

Base URL
https://cotlet.dev/api/v1/paperless-post
Connects with
Your own Paperless Post account (the host or a co-host of the event)
Integration page
Paperless Post
Paperless Post Endpoints
Endpoint Access Description
list_events read Your Cards and Flyers from My Events, with type, date and send status.
get_event read Event details: title, host, date, time, location and the design type.
list_guests read The Tracking page: each guest or group with status, number attending and Guest Tags.
get_guest read One guest: status, number attending and the messages sent to them.
export_guest_list read The Tracking page as a CSV download link, with each guest's RSVP status.
list_contacts read Your Address Book: names, emails and phone numbers saved for reuse.
add_guests write Add guests to the unsent guest list of an event. Nothing is sent until send_invitation.
send_invitation write Send the Card or Flyer to everyone on the unsent list, now or at a set time.
send_message write Broadcast from Messages & Reminders to guests by status and Guest Tag.
send_private_message write Message one guest in their message log.
tag_guests write Add a Guest Tag to guests. Tags are visible to hosts and co-hosts only.

POST https://cotlet.dev/api/v1/paperless-post/list_events

Returns the Cards and Flyers on your account, newest first. Use the event_id of each item in the other endpoints. Drafts have no guests sent yet.

Parameters

Parameters: list_events
NameTypeDescription
status enum draft, sent or scheduled. Default: sent.
limit integer Number of events to return. Default: 20.
cursor string Next page cursor from the previous call.

Request

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

Example response

{
  "events": [
    {
      "event_id": "ev_8F3K2Q",
      "title": "Summer Gala",
      "type": "card",
      "status": "sent",
      "event_date": "2026-10-17T19:00:00-04:00"
    },
    {
      "event_id": "ev_2M9X1B",
      "title": "Baby shower",
      "type": "flyer",
      "status": "draft",
      "event_date": "2026-11-08T14:00:00-05:00"
    }
  ],
  "next_cursor": null
}

Get event

read

POST https://cotlet.dev/api/v1/paperless-post/get_event

Returns what guests see on the invitation: title, host name, date and time, time zone and location. Use it before a time or location message so the text matches the invitation.

Parameters

Parameters: get_event
NameTypeDescription
event_id required string Card or Flyer ID from list_events.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/paperless-post/get_event \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
Python
result = client.call("paperless-post", "get_event", {"event_id":"event_8c41d2"})
Node.js
const result = await cotlet.call('paperless-post', 'get_event', {"event_id":"event_8c41d2"});
CLI
cotlet call paperless-post get_event --data '{"event_id":"event_8c41d2"}'

Example response

{
  "event_id": "ev_8F3K2Q",
  "title": "Summer Gala",
  "type": "card",
  "host": "Dana Whitfield",
  "event_date": "2026-10-17T19:00:00-04:00",
  "location": "The Boathouse, 12 Pier Road",
  "status": "sent"
}

POST https://cotlet.dev/api/v1/paperless-post/list_guests

Returns the rows of the Tracking page for one event, with each guest's status, how many are attending and their Guest Tags. Guest Tags show only if you are a host or co-host. Pass guest_id to get_guest or tag_guests.

Parameters

Parameters: list_guests
NameTypeDescription
event_id required string Card or Flyer ID from list_events.
status string Only guests with this status as shown on the Tracking page, for example attending.
tag string Only guests with this Guest Tag.
search string Match by name, email or phone.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/paperless-post/list_guests \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
Python
result = client.call("paperless-post", "list_guests", {"event_id":"event_8c41d2"})
Node.js
const result = await cotlet.call('paperless-post', 'list_guests', {"event_id":"event_8c41d2"});
CLI
cotlet call paperless-post list_guests --data '{"event_id":"event_8c41d2"}'

Example response

{
  "guests": [
    {
      "guest_id": "g_20417",
      "name": "Maya Chen",
      "status": "attending",
      "total_attending": 2,
      "tags": []
    },
    {
      "guest_id": "g_20433",
      "name": "Jordan Reyes",
      "status": "opened",
      "total_attending": 0,
      "tags": []
    }
  ],
  "next_cursor": null
}

Get guest

read

POST https://cotlet.dev/api/v1/paperless-post/get_guest

Returns one row of the Tracking page with the broadcast and private messages sent to that guest. Use it to check what a guest already received before you write again.

Parameters

Parameters: get_guest
NameTypeDescription
event_id required string Card or Flyer ID from list_events.
guest_id required string Guest ID from list_guests.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/paperless-post/get_guest \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2","guest_id":"guest_8c41d2"}'
Python
result = client.call("paperless-post", "get_guest", {"event_id":"event_8c41d2","guest_id":"guest_8c41d2"})
Node.js
const result = await cotlet.call('paperless-post', 'get_guest', {"event_id":"event_8c41d2","guest_id":"guest_8c41d2"});
CLI
cotlet call paperless-post get_guest --data '{"event_id":"event_8c41d2","guest_id":"guest_8c41d2"}'

Example response

{
  "guest_id": "g_20433",
  "name": "Jordan Reyes",
  "status": "opened",
  "total_attending": 0,
  "tags": [],
  "messages": [
    {
      "type": "broadcast",
      "subject": "Please RSVP by Friday",
      "sent_at": "2026-10-10T18:42:00-04:00"
    }
  ]
}

POST https://cotlet.dev/api/v1/paperless-post/export_guest_list

Returns a link to the CSV the Export guest list button on the Tracking page downloads. The link works for a limited time, so download it right away. Reads only; nothing changes in Paperless Post.

Parameters

Parameters: export_guest_list
NameTypeDescription
event_id required string Card or Flyer ID from list_events.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/paperless-post/export_guest_list \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
Python
result = client.call("paperless-post", "export_guest_list", {"event_id":"event_8c41d2"})
Node.js
const result = await cotlet.call('paperless-post', 'export_guest_list', {"event_id":"event_8c41d2"});
CLI
cotlet call paperless-post export_guest_list --data '{"event_id":"event_8c41d2"}'

Example response

{
  "event_id": "ev_8F3K2Q",
  "rows": 41,
  "download_url": "https://files.cotlet.example/exports/ev_8F3K2Q-guests.csv"
}

POST https://cotlet.dev/api/v1/paperless-post/list_contacts

Returns the contacts saved in your Address Book, so your agent can add known people to a guest list without a file. Matching by search is case insensitive.

Parameters

Parameters: list_contacts
NameTypeDescription
search string Match by name, email or phone.
cursor string Next page cursor from the previous call.

Request

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

Example response

{
  "contacts": [
    {
      "contact_id": "c_7731",
      "name": "Maya Chen",
      "email": "maya@example.com"
    },
    {
      "contact_id": "c_7740",
      "name": "Jordan Reyes",
      "email": "jordan@example.com"
    }
  ],
  "next_cursor": null
}

Add guests

write

POST https://cotlet.dev/api/v1/paperless-post/add_guests

Adds guests to the unsent list, the same list the spreadsheet upload fills. Each guest needs a name and an email or phone number. Nothing reaches the guests until send_invitation, and you remove a guest in the app, so this call needs no confirmation.

Parameters

Parameters: add_guests
NameTypeDescription
event_id required string Card or Flyer ID from list_events.
guests required object[] List of { name, email or phone, group_name, total_invited }.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/paperless-post/add_guests \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"ev_8F3K2Q","guests":[{"name":"Maya Chen","email":"maya@example.com","total_invited":2},{"name":"Jordan Reyes","email":"jordan@example.com","group_name":"Reyes family"},{"name":"Ana Reyes","phone":"+12125550188","group_name":"Reyes family"}]}'
Python
result = client.call("paperless-post", "add_guests", {"event_id":"ev_8F3K2Q","guests":[{"name":"Maya Chen","email":"maya@example.com","total_invited":2},{"name":"Jordan Reyes","email":"jordan@example.com","group_name":"Reyes family"},{"name":"Ana Reyes","phone":"+12125550188","group_name":"Reyes family"}]})
Node.js
const result = await cotlet.call('paperless-post', 'add_guests', {"event_id":"ev_8F3K2Q","guests":[{"name":"Maya Chen","email":"maya@example.com","total_invited":2},{"name":"Jordan Reyes","email":"jordan@example.com","group_name":"Reyes family"},{"name":"Ana Reyes","phone":"+12125550188","group_name":"Reyes family"}]});
CLI
cotlet call paperless-post add_guests --data '{"event_id":"ev_8F3K2Q","guests":[{"name":"Maya Chen","email":"maya@example.com","total_invited":2},{"name":"Jordan Reyes","email":"jordan@example.com","group_name":"Reyes family"},{"name":"Ana Reyes","phone":"+12125550188","group_name":"Reyes family"}]}'

Example response

{
  "event_id": "ev_8F3K2Q",
  "added": 2,
  "unsent_list_total": 2,
  "status": "unsent"
}

Send invitation

write Confirm

POST https://cotlet.dev/api/v1/paperless-post/send_invitation

Sends the invitation to everyone on the unsent guest list. With send_at it is scheduled instead of sent now. Guests receive it as soon as it goes out. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: send_invitation
NameTypeDescription
event_id required string Card or Flyer ID from list_events.
send_at datetime ISO 8601 with time zone. Empty: send now.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/paperless-post/send_invitation \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2"}'
Python
result = client.call("paperless-post", "send_invitation", {"event_id":"event_8c41d2"})
Node.js
const result = await cotlet.call('paperless-post', 'send_invitation', {"event_id":"event_8c41d2"});
CLI
cotlet call paperless-post send_invitation --data '{"event_id":"event_8c41d2"}'

Example response

{
  "event_id": "ev_8F3K2Q",
  "status": "scheduled",
  "recipients": 41,
  "send_at": "2026-10-16T09:00:00-04:00"
}

Send message

write Confirm

POST https://cotlet.dev/api/v1/paperless-post/send_message

Sends a broadcast like the Messages & Reminders screen: pick a template or write your own, then recipients by guest status and optional Guest Tags. The text is limited to 2,000 characters and cannot carry attachments. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: send_message
NameTypeDescription
event_id required string Card or Flyer ID from list_events.
template enum reminder_to_rsvp, event_reminder, time_location_change or write_your_own. Default: write_your_own.
message required string Message text, up to 2,000 characters. No attachments.
subject string Email subject.
statuses string[] Guest statuses to reach, as shown on the Tracking page, for example attending. Default: all guests.
tags string[] Only guests with these Guest Tags.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/paperless-post/send_message \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"ev_8F3K2Q","template":"reminder_to_rsvp","subject":"Please RSVP by Friday","message":"Hi! We are finalizing the headcount for the Summer Gala. Please reply by Friday.","statuses":["opened"]}'
Python
result = client.call("paperless-post", "send_message", {"event_id":"ev_8F3K2Q","template":"reminder_to_rsvp","subject":"Please RSVP by Friday","message":"Hi! We are finalizing the headcount for the Summer Gala. Please reply by Friday.","statuses":["opened"]})
Node.js
const result = await cotlet.call('paperless-post', 'send_message', {"event_id":"ev_8F3K2Q","template":"reminder_to_rsvp","subject":"Please RSVP by Friday","message":"Hi! We are finalizing the headcount for the Summer Gala. Please reply by Friday.","statuses":["opened"]});
CLI
cotlet call paperless-post send_message --data '{"event_id":"ev_8F3K2Q","template":"reminder_to_rsvp","subject":"Please RSVP by Friday","message":"Hi! We are finalizing the headcount for the Summer Gala. Please reply by Friday.","statuses":["opened"]}'

Example response

{
  "event_id": "ev_8F3K2Q",
  "broadcast_id": "bc_51290",
  "status": "sent",
  "recipients": 23,
  "sent_at": "2026-10-10T18:42:00-04:00"
}

Send private message

write Confirm

POST https://cotlet.dev/api/v1/paperless-post/send_private_message

Sends a private message to one guest, as the Private message option in Messages & Reminders does. The text is limited to 2,000 characters. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: send_private_message
NameTypeDescription
event_id required string Card or Flyer ID from list_events.
guest_id required string Guest ID from list_guests.
message required string Message text, up to 2,000 characters.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/paperless-post/send_private_message \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"event_8c41d2","guest_id":"guest_8c41d2","message":"message"}'
Python
result = client.call("paperless-post", "send_private_message", {"event_id":"event_8c41d2","guest_id":"guest_8c41d2","message":"message"})
Node.js
const result = await cotlet.call('paperless-post', 'send_private_message', {"event_id":"event_8c41d2","guest_id":"guest_8c41d2","message":"message"});
CLI
cotlet call paperless-post send_private_message --data '{"event_id":"event_8c41d2","guest_id":"guest_8c41d2","message":"message"}'

Example response

{
  "event_id": "ev_8F3K2Q",
  "guest_id": "g_20433",
  "status": "sent",
  "sent_at": "2026-10-10T19:05:00-04:00"
}

Tag guests

write

POST https://cotlet.dev/api/v1/paperless-post/tag_guests

Adds one Guest Tag to the guests you list; the tag is created if it does not exist. Guest Tags need All Access pricing or Paperless Pro, otherwise the call fails. Tags reach no one and one call removes them, so this call needs no confirmation.

Parameters

Parameters: tag_guests
NameTypeDescription
event_id required string Card or Flyer ID from list_events.
guest_ids required string[] Guest IDs from list_guests.
tag required string Tag name; created if it does not exist.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/paperless-post/tag_guests \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_id":"ev_8F3K2Q","guest_ids":["g_20417","g_20433"],"tag":"lodging"}'
Python
result = client.call("paperless-post", "tag_guests", {"event_id":"ev_8F3K2Q","guest_ids":["g_20417","g_20433"],"tag":"lodging"})
Node.js
const result = await cotlet.call('paperless-post', 'tag_guests', {"event_id":"ev_8F3K2Q","guest_ids":["g_20417","g_20433"],"tag":"lodging"});
CLI
cotlet call paperless-post tag_guests --data '{"event_id":"ev_8F3K2Q","guest_ids":["g_20417","g_20433"],"tag":"lodging"}'

Example response

{
  "event_id": "ev_8F3K2Q",
  "tag": "lodging",
  "tagged": 2
}