REST API reference
Partiful API
13 endpoints for Partiful. Each one is a POST with a JSON body, called with your API key.
- Base URL
- https://cotlet.dev/api/v1/partiful
- Connects with
- Your own Partiful host account
- Integration page
- Partiful
| Endpoint | Access | Description |
|---|---|---|
| list_events | read | Events you host, with date, status and guest counts. |
| get_event | read | Full event: title, description, start and end, location, RSVP deadline, guest limit, Guest Approval and waitlist settings, link. |
| list_guests | read | Guests of an event with RSVP status, check-in and Guest Questionnaire answers. |
| export_guest_list | read | The guest list as a CSV file link, the same file as the Export CSV button. |
| list_past_guests | read | People you can invite: your past guests and mutuals, optionally from one past event. |
| create_event | write | New event page. Nobody is invited until you call invite_guests. |
| update_event | write | Change the details or settings of an event you host. |
| duplicate_event | write | Copy an event with its settings to a new date. The copy has no guests yet. |
| invite_guests | write | Invite past guests and mutuals through Partiful, or anyone by email. |
| approve_guests | write | Approve pending guests on a Guest Approval event. |
| check_in_guests | write | Mark guests as checked in at the door, or undo it. |
| send_text_blast | write | Text a message to guests by RSVP status. Partiful allows up to 10 Text Blasts per event. |
| cancel_event | write | Cancel an event. Partiful notifies the guests. |
List events
readPOST https://cotlet.dev/api/v1/partiful/list_events
Returns your events with start time, whether the event is canceled and counts of guests by RSVP status. Use event_id from each item in the other tools. Pages hold up to 50 events; pass next_cursor back as cursor for the next page.
Parameters
| Name | Type | Description |
|---|---|---|
| when | enum | upcoming, past or all. Default: upcoming. |
| limit | integer | 1 to 50. Default: 20. |
| cursor | string | Next page cursor from the previous call. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/list_events \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("partiful", "list_events") const result = await cotlet.call('partiful', 'list_events'); cotlet call partiful list_events Example response
{
"events": [
{
"event_id": "evt_hK3vQ9xL",
"title": "Rooftop dinner",
"start_at": "2026-10-17T19:00:00-04:00",
"status": "active",
"guests": {
"going": 28,
"maybe": 9,
"cant_go": 4,
"invited": 31,
"pending": 0
}
},
{
"event_id": "evt_pL8wN2aD",
"title": "Launch party",
"start_at": "2026-10-24T20:00:00-04:00",
"status": "active",
"guests": {
"going": 52,
"maybe": 6,
"cant_go": 11,
"invited": 60,
"pending": 3
}
}
],
"next_cursor": null
} Get event
readPOST https://cotlet.dev/api/v1/partiful/get_event
Returns one event with its details and the settings you chose in Event Settings: guest limit, waitlist, Guest Approval and the Guest Questionnaire questions. Use it before update_event to see what is set now.
Parameters
| Name | Type | Description |
|---|---|---|
| event_id required | string | Event ID from list_events. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/get_event \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event_id":"event_8c41d2"}' result = client.call("partiful", "get_event", {"event_id":"event_8c41d2"}) const result = await cotlet.call('partiful', 'get_event', {"event_id":"event_8c41d2"}); cotlet call partiful get_event --data '{"event_id":"event_8c41d2"}' Example response
{
"event_id": "evt_hK3vQ9xL",
"title": "Rooftop dinner",
"start_at": "2026-10-17T19:00:00-04:00",
"end_at": "2026-10-17T23:00:00-04:00",
"location": "21 Mercer St, New York",
"description": "Bring a drink to share.",
"rsvp_deadline": "2026-10-15T18:00:00-04:00",
"max_guests": 60,
"waitlist": true,
"guest_approval": false,
"questions": [
"Dietary restrictions"
],
"url": "https://partiful.com/e/hK3vQ9xLexample"
} List guests
readPOST https://cotlet.dev/api/v1/partiful/list_guests
Returns the guests of one event, each with RSVP status, whether they are checked in and their answers to your Guest Questionnaire. Filter by status to see only pending guests or only the ones going. Pages hold up to 200 guests; pass next_cursor back as cursor for the next page.
Parameters
| Name | Type | Description |
|---|---|---|
| event_id required | string | Event ID from list_events. |
| status | enum | all, going, maybe, cant_go, invited, waitlist or pending. Default: all. |
| checked_in | boolean | Only guests who are checked in (true) or not (false). |
| limit | integer | 1 to 200. Default: 100. |
| cursor | string | Next page cursor from the previous call. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/list_guests \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event_id":"event_8c41d2"}' result = client.call("partiful", "list_guests", {"event_id":"event_8c41d2"}) const result = await cotlet.call('partiful', 'list_guests', {"event_id":"event_8c41d2"}); cotlet call partiful list_guests --data '{"event_id":"event_8c41d2"}' Example response
{
"guests": [
{
"guest_id": "g_41aa",
"name": "Maya Chen",
"status": "going",
"checked_in": false,
"answers": [
{
"question": "Dietary restrictions",
"answer": "Vegetarian"
}
]
},
{
"guest_id": "g_41ab",
"name": "Leo Park",
"status": "going",
"checked_in": false,
"answers": [
{
"question": "Dietary restrictions",
"answer": "Peanut allergy"
}
]
}
],
"next_cursor": null
} Export guest list
readPOST https://cotlet.dev/api/v1/partiful/export_guest_list
Returns a link to the CSV that Partiful's Export CSV button produces, limited to the RSVP statuses you choose. It includes Guest Questionnaire answers. Your agent or n8n flow reads the file and appends the rows to a sheet or CRM.
Parameters
| Name | Type | Description |
|---|---|---|
| event_id required | string | Event ID from list_events. |
| statuses | string[] | RSVP statuses to include: going, maybe, cant_go, invited, waitlist, pending. Default: all. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/export_guest_list \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event_id":"evt_hK3vQ9xL","statuses":["going"]}' result = client.call("partiful", "export_guest_list", {"event_id":"evt_hK3vQ9xL","statuses":["going"]}) const result = await cotlet.call('partiful', 'export_guest_list', {"event_id":"evt_hK3vQ9xL","statuses":["going"]}); cotlet call partiful export_guest_list --data '{"event_id":"evt_hK3vQ9xL","statuses":["going"]}' Example response
{
"event_id": "evt_hK3vQ9xL",
"statuses": [
"going"
],
"guests": 28,
"download_url": "https://cotlet.dev/api/v1/files/exports/partiful/evt_hK3vQ9xL-going.csv"
} List past guests
readPOST https://cotlet.dev/api/v1/partiful/list_past_guests
Returns people you can invite again: guests who attended your events and mutuals. Filter to one past event to invite only the people who came to it. Use user_id from each item in invite_guests. Pages hold up to 200 people.
Parameters
| Name | Type | Description |
|---|---|---|
| from_event_id | string | Only people from this past event. |
| query | string | Search by name. |
| limit | integer | 1 to 200. Default: 50. |
| cursor | string | Next page cursor from the previous call. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/list_past_guests \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("partiful", "list_past_guests") const result = await cotlet.call('partiful', 'list_past_guests'); cotlet call partiful list_past_guests Example response
{
"people": [
{
"user_id": "u_2f81",
"name": "Maya Chen",
"attended": 3
},
{
"user_id": "u_2f93",
"name": "Leo Park",
"attended": 2
}
],
"next_cursor": null
} Create event
writePOST https://cotlet.dev/api/v1/partiful/create_event
Creates an event page on your account. Nobody is invited and nothing is sent, so there is no confirmation; one call to update_event or cancel_event changes it. Guest Approval and the Guest Questionnaire are set here, the same way as in Event Settings.
Parameters
| Name | Type | Description |
|---|---|---|
| title required | string | Event title. |
| start_at required | datetime | ISO 8601 with time zone. |
| end_at | datetime | ISO 8601 with time zone. |
| location | string | Address or place name. |
| description | string | Event details shown on the page. |
| rsvp_deadline | datetime | Last moment guests can RSVP. |
| max_guests | integer | Guest limit; with the waitlist on, extra RSVPs go to the waitlist. |
| guest_approval | boolean | Guests ask to get on the list and you approve them. Default: false. |
| questions | string[] | Guest Questionnaire questions, short answer. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/create_event \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"title","start_at":"2026-10-01T09:00:00Z"}' result = client.call("partiful", "create_event", {"title":"title","start_at":"2026-10-01T09:00:00Z"}) const result = await cotlet.call('partiful', 'create_event', {"title":"title","start_at":"2026-10-01T09:00:00Z"}); cotlet call partiful create_event --data '{"title":"title","start_at":"2026-10-01T09:00:00Z"}' Example response
{
"event_id": "evt_bK7dR3nM",
"title": "Book club: November",
"start_at": "2026-11-14T19:00:00-05:00",
"status": "active",
"url": "https://partiful.com/e/bK7dR3nMexample"
} Update event
writePOST https://cotlet.dev/api/v1/partiful/update_event
Changes the fields you pass and leaves the rest as it is. It sends nothing itself, so there is no confirmation, and another call restores the old values. Use get_event first to see the current values.
Parameters
| Name | Type | Description |
|---|---|---|
| event_id required | string | Event ID from list_events. |
| fields required | object | Any of title, start_at, end_at, location, description, rsvp_deadline, max_guests, guest_approval. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/update_event \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event_id":"event_8c41d2","fields":"fields"}' result = client.call("partiful", "update_event", {"event_id":"event_8c41d2","fields":"fields"}) const result = await cotlet.call('partiful', 'update_event', {"event_id":"event_8c41d2","fields":"fields"}); cotlet call partiful update_event --data '{"event_id":"event_8c41d2","fields":"fields"}' Example response
{
"event_id": "evt_hK3vQ9xL",
"updated": [
"location"
],
"location": "88 Bleecker St, New York"
} Duplicate event
writePOST https://cotlet.dev/api/v1/partiful/duplicate_event
Does what Clone Event does in Partiful: copies the event details to a new event on the date you give. Guests are not copied, so re-invite them with invite_guests. It sends nothing, so there is no confirmation.
Parameters
| Name | Type | Description |
|---|---|---|
| event_id required | string | Event ID from list_events. |
| start_at required | datetime | Start of the new event, ISO 8601 with time zone. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/duplicate_event \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event_id":"event_8c41d2","start_at":"2026-10-01T09:00:00Z"}' result = client.call("partiful", "duplicate_event", {"event_id":"event_8c41d2","start_at":"2026-10-01T09:00:00Z"}) const result = await cotlet.call('partiful', 'duplicate_event', {"event_id":"event_8c41d2","start_at":"2026-10-01T09:00:00Z"}); cotlet call partiful duplicate_event --data '{"event_id":"event_8c41d2","start_at":"2026-10-01T09:00:00Z"}' Example response
{
"event_id": "evt_bK7dR3nM",
"copied_from": "evt_aQ4tX9cE",
"start_at": "2026-11-14T19:00:00-05:00",
"guests": 0
} POST https://cotlet.dev/api/v1/partiful/invite_guests
Invites people you pick from list_past_guests and sends email invites to the addresses you give. Partiful caps invites per event at 1,000 in total and 500 by email; a call over the cap fails. Invitees reached by email still log in with their phone number to RSVP. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| event_id required | string | Event ID from list_events. |
| user_ids | string[] | People from list_past_guests. |
| emails | string[] | Email addresses to invite. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/invite_guests \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event_id":"evt_bK7dR3nM","user_ids":["u_2f81","u_2f93"]}' result = client.call("partiful", "invite_guests", {"event_id":"evt_bK7dR3nM","user_ids":["u_2f81","u_2f93"]}) const result = await cotlet.call('partiful', 'invite_guests', {"event_id":"evt_bK7dR3nM","user_ids":["u_2f81","u_2f93"]}); cotlet call partiful invite_guests --data '{"event_id":"evt_bK7dR3nM","user_ids":["u_2f81","u_2f93"]}' Example response
{
"event_id": "evt_bK7dR3nM",
"invited": 2,
"by_email": 0,
"status": "sent"
} POST https://cotlet.dev/api/v1/partiful/approve_guests
Marks the guests you name as Approved on an event that has Guest Approval on. Only approved guests have access to the event. Guests you leave alone stay Pending. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| event_id required | string | Event ID from list_events. |
| guest_ids required | string[] | Guest IDs from list_guests. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/approve_guests \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event_id":"evt_pL8wN2aD","guest_ids":["g_41aa","g_41ab"]}' result = client.call("partiful", "approve_guests", {"event_id":"evt_pL8wN2aD","guest_ids":["g_41aa","g_41ab"]}) const result = await cotlet.call('partiful', 'approve_guests', {"event_id":"evt_pL8wN2aD","guest_ids":["g_41aa","g_41ab"]}); cotlet call partiful approve_guests --data '{"event_id":"evt_pL8wN2aD","guest_ids":["g_41aa","g_41ab"]}' Example response
{
"event_id": "evt_pL8wN2aD",
"approved": 2,
"still_pending": 1
} Check in guests
writePOST https://cotlet.dev/api/v1/partiful/check_in_guests
Checks in the guests you name, like checking them in manually from the guest list. Guests are not notified, and set undo to true to remove a check-in, so it runs without asking first.
Parameters
| Name | Type | Description |
|---|---|---|
| event_id required | string | Event ID from list_events. |
| guest_ids required | string[] | Guest IDs from list_guests. |
| undo | boolean | Remove the check-in instead. Default: false. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/check_in_guests \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event_id":"event_8c41d2","guest_ids":["guest ids"]}' result = client.call("partiful", "check_in_guests", {"event_id":"event_8c41d2","guest_ids":["guest ids"]}) const result = await cotlet.call('partiful', 'check_in_guests', {"event_id":"event_8c41d2","guest_ids":["guest ids"]}); cotlet call partiful check_in_guests --data '{"event_id":"event_8c41d2","guest_ids":["guest ids"]}' Example response
{
"event_id": "evt_hK3vQ9xL",
"checked_in": 2,
"undo": false
} POST https://cotlet.dev/api/v1/partiful/send_text_blast
Sends one Text Blast to the guests in the statuses you pick, the same as New Blast on the event page. It reaches guests who RSVP'd or were invited directly through Partiful; guests invited by email get it by email until they RSVP. Returns how many people it went to and how many blasts are left. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| event_id required | string | Event ID from list_events. |
| message required | string | Message text. |
| statuses required | string[] | Who receives it: going, maybe, cant_go, invited. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/send_text_blast \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event_id":"evt_hK3vQ9xL","message":"Door code is 4512. We start at 7:30, see you soon!","statuses":["going","maybe"]}' result = client.call("partiful", "send_text_blast", {"event_id":"evt_hK3vQ9xL","message":"Door code is 4512. We start at 7:30, see you soon!","statuses":["going","maybe"]}) const result = await cotlet.call('partiful', 'send_text_blast', {"event_id":"evt_hK3vQ9xL","message":"Door code is 4512. We start at 7:30, see you soon!","statuses":["going","maybe"]}); cotlet call partiful send_text_blast --data '{"event_id":"evt_hK3vQ9xL","message":"Door code is 4512. We start at 7:30, see you soon!","statuses":["going","maybe"]}' Example response
{
"blast_id": "bl_8Fq2Lw0Zr4",
"event_id": "evt_hK3vQ9xL",
"recipients": 37,
"by_status": {
"going": 28,
"maybe": 9
},
"blasts_left": 7,
"sent_at": "2026-10-17T18:42:05-04:00"
} POST https://cotlet.dev/api/v1/partiful/cancel_event
Cancels the event the way Cancel Event does in Partiful. Guests are notified; Partiful has no way to cancel without telling them. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| event_id required | string | Event ID from list_events. |
Request
curl -X POST https://cotlet.dev/api/v1/partiful/cancel_event \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event_id":"event_8c41d2"}' result = client.call("partiful", "cancel_event", {"event_id":"event_8c41d2"}) const result = await cotlet.call('partiful', 'cancel_event', {"event_id":"event_8c41d2"}); cotlet call partiful cancel_event --data '{"event_id":"event_8c41d2"}' Example response
{
"event_id": "evt_hK3vQ9xL",
"status": "canceled",
"guests_notified": true
}