curl -X DELETE -H "X-API-KEY: your_api_key" \
https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA
# Body form
curl -X DELETE -H "X-API-KEY: your_api_key" \
-H "Content-Type: application/json" \
-d '{ "refund": { "confirm": true, "quote_id": "9f2c4e71a0b84d3c8e5f6a7b1c2d3e4f" } }' \
https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA
# Query form, for clients that can't send a DELETE body
curl -X DELETE -H "X-API-KEY: your_api_key" \
"https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA?confirm_refund=true"e_id=9f2c4e71a0b84d3c8e5f6a7b1c2d3e4f"
const url = "https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA";
const headers = { "X-API-KEY": "your_api_key" };
let response = await fetch(url, { method: "DELETE", headers });
if (response.status === 409) {
const body = await response.json();
if (body.error === "refund_confirmation_required") {
// Show body.quote to the organizer, then confirm it.
response = await fetch(url, {
method: "DELETE",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({ refund: { confirm: true, quote_id: body.quote.quote_id } }),
});
}
}
{
"error": "refund_confirmation_required",
"message": "This attendee paid. The change refunds them in full and your organization covers the fees. Resend with `refund: { confirm: true, quote_id }` to go ahead.",
"quote": {
"quote_id": "9f2c4e71a0b84d3c8e5f6a7b1c2d3e4f",
"buyers": 1,
"tickets": 1,
"totals": [{ "currency": "eur", "refund": 53.4, "fees_covered": 3.4 }],
"orders": [
{
"payment_id": "pay_XYZ",
"currency": "eur",
"refund_amount": 53.4,
"fees_covered": 3.4,
"attendee_ids": ["tkt_AAA"]
}
],
"balances": [
{
"space_id": "Qm3kV8pLx2NcR7tYw9Ab",
"currency": "eur",
"balance": 420,
"refund_total": 53.4,
"shortfall": 0
}
],
"not_refunded": { "paid_offline": 0, "resale": 0, "bundle": 0, "credits": 0 }
}
}
{ "deleted": true, "id": "tkt_AAA" }
{
"error": "refund_permission_required",
"message": "This attendee paid, and refunding them needs an API key with 'read' access to 'payments'."
}
Attendees
Delete Attendee
Soft-delete an attendee (ticket)
DELETE
/
events
/
{eventId}
/
attendees
/
{attendeeId}
curl -X DELETE -H "X-API-KEY: your_api_key" \
https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA
# Body form
curl -X DELETE -H "X-API-KEY: your_api_key" \
-H "Content-Type: application/json" \
-d '{ "refund": { "confirm": true, "quote_id": "9f2c4e71a0b84d3c8e5f6a7b1c2d3e4f" } }' \
https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA
# Query form, for clients that can't send a DELETE body
curl -X DELETE -H "X-API-KEY: your_api_key" \
"https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA?confirm_refund=true"e_id=9f2c4e71a0b84d3c8e5f6a7b1c2d3e4f"
const url = "https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA";
const headers = { "X-API-KEY": "your_api_key" };
let response = await fetch(url, { method: "DELETE", headers });
if (response.status === 409) {
const body = await response.json();
if (body.error === "refund_confirmation_required") {
// Show body.quote to the organizer, then confirm it.
response = await fetch(url, {
method: "DELETE",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({ refund: { confirm: true, quote_id: body.quote.quote_id } }),
});
}
}
{
"error": "refund_confirmation_required",
"message": "This attendee paid. The change refunds them in full and your organization covers the fees. Resend with `refund: { confirm: true, quote_id }` to go ahead.",
"quote": {
"quote_id": "9f2c4e71a0b84d3c8e5f6a7b1c2d3e4f",
"buyers": 1,
"tickets": 1,
"totals": [{ "currency": "eur", "refund": 53.4, "fees_covered": 3.4 }],
"orders": [
{
"payment_id": "pay_XYZ",
"currency": "eur",
"refund_amount": 53.4,
"fees_covered": 3.4,
"attendee_ids": ["tkt_AAA"]
}
],
"balances": [
{
"space_id": "Qm3kV8pLx2NcR7tYw9Ab",
"currency": "eur",
"balance": 420,
"refund_total": 53.4,
"shortfall": 0
}
],
"not_refunded": { "paid_offline": 0, "resale": 0, "bundle": 0, "credits": 0 }
}
}
{ "deleted": true, "id": "tkt_AAA" }
{
"error": "refund_permission_required",
"message": "This attendee paid, and refunding them needs an API key with 'read' access to 'payments'."
}
Delete Attendee
Soft-deletes a single attendee (ticket). Routes through the same canonical action asPATCH { status: "deleted" }, so statusChangeHistory, payment-hold releases and refunds behave exactly as they do on the dashboard. An attendee who paid is refunded in full first, and the delete needs a refund confirmation: see Paid attendees are refunded.
Requires the attendees:write scope. Deleting an attendee who paid also needs payments:read on the key.
Path Parameters
string
required
The unique identifier of the event.
string
required
The unique identifier of the attendee (ticket).
Query Parameters
For clients that can’t send a body withDELETE, the refund confirmation can go in the query string instead.
boolean
true confirms the refund. Only read together with quote_id.string
quote.quote_id from the 409 refund_confirmation_required answer.Request Body
The body is optional. Send one only to confirm a refund.object
Confirms the refund the delete makes on an attendee who paid. Send it on the second request, after a
409 refund_confirmation_required. Ignored when the delete refunds nobody. Any other body field answers 400 Validation failed.Response
Returns200 OK with:
{ "deleted": true, "id": "tkt_AAA" }
404.
Paid attendees are refunded
Deleting an attendee whose ticket was paid (a captured card payment with money still left on it, whatever the ticket’s status) refunds that ticket in full. Your organization covers every fee (the Gomry service fee and card processing), and the whole amount comes out of your Gomry balance. There is no way to delete a paid attendee without refunding them. The steps are the same as on Update Attendee:- Send the
DELETE. The API answers409 refund_confirmation_requiredwith the refundquoteand changes nothing. - Resend it with
{ "refund": { "confirm": true, "quote_id": "<quote.quote_id>" } }as the body, or with?confirm_refund=true"e_id=<quote.quote_id>. The refund is made and the attendee deleted in that request.
DELETE sends no status email, so a refunded attendee gets the standard refund receipt for the amount returned to their card. To send them the “your registration was cancelled” email with the refund in it instead, use PATCH with status: "deleted" and notify_guest: true.
Errors
404 Attendee not found— ticket missing or not owned by your org.422— the underlying delete was rejected (e.g. the ticket is part of an in-flight upgrade flow). The responseerrorfield carries the reason.400 Validation failed: the body was sent but isn’t{ "refund": { "confirm": true, "quote_id": "..." } }.409 refund_confirmation_required: the attendee paid. The body carries thequote; resend with the confirmation. Nothing changed.409 refund_quote_changed: the refund changed since it was quoted. The body carries the newquote; confirm itsquote_id. Nothing changed.409 insufficient_balance: the balance can’t cover the refund (seequote.balances[].shortfall). Add funds on the dashboard (Payments, then Add funds), then resend; deposits can’t be made with an API key. Nothing changed.403 refund_permission_required: the attendee paid and the key has noreadaccess topayments. Nothing changed.502 refund_failed: the payment provider refused a refund after every check passed.refundedlists the refunds that went through first (payment_id,amount,currency). Retry: the next attempt quotes only what is left.
curl -X DELETE -H "X-API-KEY: your_api_key" \
https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA
# Body form
curl -X DELETE -H "X-API-KEY: your_api_key" \
-H "Content-Type: application/json" \
-d '{ "refund": { "confirm": true, "quote_id": "9f2c4e71a0b84d3c8e5f6a7b1c2d3e4f" } }' \
https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA
# Query form, for clients that can't send a DELETE body
curl -X DELETE -H "X-API-KEY: your_api_key" \
"https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA?confirm_refund=true"e_id=9f2c4e71a0b84d3c8e5f6a7b1c2d3e4f"
const url = "https://www.gomry.com/api/v1/events/AbCdEfGhIjKlMnOpQrSt/attendees/tkt_AAA";
const headers = { "X-API-KEY": "your_api_key" };
let response = await fetch(url, { method: "DELETE", headers });
if (response.status === 409) {
const body = await response.json();
if (body.error === "refund_confirmation_required") {
// Show body.quote to the organizer, then confirm it.
response = await fetch(url, {
method: "DELETE",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({ refund: { confirm: true, quote_id: body.quote.quote_id } }),
});
}
}
{
"error": "refund_confirmation_required",
"message": "This attendee paid. The change refunds them in full and your organization covers the fees. Resend with `refund: { confirm: true, quote_id }` to go ahead.",
"quote": {
"quote_id": "9f2c4e71a0b84d3c8e5f6a7b1c2d3e4f",
"buyers": 1,
"tickets": 1,
"totals": [{ "currency": "eur", "refund": 53.4, "fees_covered": 3.4 }],
"orders": [
{
"payment_id": "pay_XYZ",
"currency": "eur",
"refund_amount": 53.4,
"fees_covered": 3.4,
"attendee_ids": ["tkt_AAA"]
}
],
"balances": [
{
"space_id": "Qm3kV8pLx2NcR7tYw9Ab",
"currency": "eur",
"balance": 420,
"refund_total": 53.4,
"shortfall": 0
}
],
"not_refunded": { "paid_offline": 0, "resale": 0, "bundle": 0, "credits": 0 }
}
}
{ "deleted": true, "id": "tkt_AAA" }
{
"error": "refund_permission_required",
"message": "This attendee paid, and refunding them needs an API key with 'read' access to 'payments'."
}

