Changelog
What changed in the Tito API, newest first. A change marked Breaking can stop an integration that works today, so check those first. To hear about each change as it ships, follow the Atom feed.
Month: October 2026
-
Added #
/design/email-cssand/events/{slug}/design/email-cssread and set a stylesheet for the emails sent about an event. Only rules that name an email class are kept, and nothing that loads from another address. -
Changed #
DELETE /connections/{service}answers409several_accountsfor Stripe while the account holds more than one Stripe account. Disconnect them one at a time withDELETE /connections/stripe/accounts/{acct}. -
Added #
An account can hold several Stripe accounts: the Stripe connection lists them as
stripe_accounts, events read and setstripe_account, and orders report thestripe_accountthey were paid into. Make one the default or disconnect one with the two new routes.- GET
/connections - GET
/events/{slug}/settings/payment - PATCH
/events/{slug}/settings/payment - POST
/connections/stripe/accounts/{acct}/default - DELETE
/connections/stripe/accounts/{acct} - OBJECT
Connection - OBJECT
StripeAccount - OBJECT
EventPaymentSettings - OBJECT
EventPaymentSettingsInput - OBJECT
Order
- GET
-
Added #
A ticket type can charge a second tax rate beside its first,
second_tax_rate_id, each charged on the price.POSTandPATCHtake it, and an order line or quote line lists each rate it charges, with its own share oftax_cents, astaxes.- GET
/events/{slug}/ticket-types - POST
/events/{slug}/ticket-types - PATCH
/events/{slug}/ticket-types/{id} - GET
/events/{slug}/orders - GET
/events/{slug}/quotes/{ref} - OBJECT
TicketType - OBJECT
TicketTypeCreate - OBJECT
TicketTypePatch - OBJECT
OrderLine - OBJECT
QuoteLine
- GET
-
Added #
A ticket type has its own sale window,
sales_start_atandsales_end_at, read on every ticket type and set with PATCH. It applies only whileon_saleis true, and outside it the type is listed withavailable0.- GET
/events/{slug}/ticket-types - PATCH
/events/{slug}/ticket-types/{id} - OBJECT
TicketType - OBJECT
TicketTypePatch
- GET
-
Changed #
A promotion
codecan be 1 to 191 characters and hold any character but whitespace, a control character and/ & % # , ; ". It was 3 to 128 of letters, digits and hyphens. A code outside the rule is refused with the same errors as before. -
Added #
POST /events/{slug}/invitations/{id}/claimand/declineanswer an invitation for somebody who replied another way. A claim issues the tickets free, past capacity and the deadline. Both take areason, and an invitation that can’t take the answer is409 not_answerable. -
Added #
Invitations have
answered_for: who claimed or declined one for the invitee, when, and theirreason, while that answer stands. It isnullwhen the invitee answered themselves.- OBJECT
Invitation
- OBJECT
-
Added #
A coupon carries
min_per_ticket_typeandmax_per_ticket_type: how many of one ticket type an order needs before the coupon comes off that type, and how many of each type it comes off.POSTandPATCHtake both, 0 for no limit, on a coupon applied to each ticket.- GET
/events/{slug}/coupons - POST
/events/{slug}/coupons - GET
/events/{slug}/coupons/{id} - PATCH
/events/{slug}/coupons/{id} - OBJECT
Coupon - OBJECT
CouponInput
- GET
-
Added #
A tax rate has
rate_milli_pct, its percentage in thousandths of a percent, so 9.975% is 9975.POST /tax-ratestakes it in place ofrate_bps.rate_bpsis still served, rounded half up where a rate has a third decimal.- POST
/tax-rates - GET
/tax-rates - OBJECT
TaxRate - OBJECT
TaxRateInput
- POST
-
Added #
Coupons have
applies_on_volume_prices,trueby default. Withfalse, a ticket the order has taken enough of for one of its volume prices is charged that price with nothing off.- GET
/events/{slug}/coupons/{id} - POST
/events/{slug}/coupons - PATCH
/events/{slug}/coupons/{id} - OBJECT
Coupon - OBJECT
CouponInput
- GET
-
Added #
GET /api-requeststakesafter, theidof the last call on the previous page,qto matchMETHOD /path, andstatus:succeeded,failedor a three-digit code. A badafteranswers422 invalid_after.- GET
/api-requests - OBJECT
APIRequest
- GET
-
Added #
Events have
secret_redirect_url: anhttpsaddress the event page sends visitors to while the event is secret. Set it withPATCH /events/{slug}.- GET
/events/{slug} - PATCH
/events/{slug} - OBJECT
Event - OBJECT
EventPatch
- GET
-
POST /events/{slug}/quotes/{ref}/convertwithconfirm: trueneedsconfirm_total_cents, thenow_centsof the409repricedanswer, on every confirm. Without it nothing is confirmed. Send both. -
Added #
Ticket types have
signup_hide_name, which leaves a free ticket's name and price off a free event's sign-up form. Only a free ticket with no price ladder can set it.- GET
/events/{slug}/ticket-types/{id} - PATCH
/events/{slug}/ticket-types/{id} - OBJECT
TicketType - OBJECT
TicketTypePatch
- GET
-
Added #
Portal placements take
positionbefore_issue, just above the Issue tickets heading on a portal'sticketspage. Any other page answers422portal_before_issue. -
POST /events/{slug}/invitation-lists/{id}/sendqueues each email and reports it asqueuedinstead ofsent, and skips one still waiting with reasonqueued. Sending one invitation then answers409queued. -
Added #
Event payment settings have
express_checkout_enabled. Off, no buyer at the event is offered Apple Pay, Google Pay, Link or PayPal as shortcuts, whatever an audience'sshow_express_checkoutsays.- GET
/events/{slug}/settings/payment - PATCH
/events/{slug}/settings/payment - OBJECT
EventPaymentSettings - OBJECT
EventPaymentSettingsInput - OBJECT
Audience
- GET
-
Added #
GET /orders/{ref}haslate_vat: VAT a company paid on a reverse-charge ticket before its VAT number was confirmed, with itsstatus,amount_centsandat. Null on every other order. -
Added #
Widgets have
prefill_review, off by default: when the website hands over a buyer's details, the widget shows the filled-in form first instead of going straight on to paying.- GET
/events/{slug}/widgets/{id} - POST
/events/{slug}/widgets - PATCH
/events/{slug}/widgets/{id} - OBJECT
WidgetSummary - OBJECT
WidgetInput
- GET
-
Added #
Ticket types have
reverse_charge("",countryoreu),reverse_charge_countryandreverse_charge_note, for companies whose VAT number the EU register confirms to pay no VAT.- GET
/events/{slug}/ticket-types/{id} - PATCH
/events/{slug}/ticket-types/{id} - OBJECT
TicketType - OBJECT
TicketTypePatch
- GET
-
Added #
Webhooks can subscribe to
order.updated,ticket.moved,ticket.unvoided,checkin.deleted,interest.createdandinterest.deleted, andPATCH /webhooks/{id}takesevent_typesto replace an endpoint's list.- GET
/webhooks - POST
/webhooks - PATCH
/webhooks/{id} - OBJECT
WebhookEndpoint
- GET
-
Changed #
Anonymizing an order, invitation or buyer cancels an order still waiting for its bank transfer first, so a payment that arrives later cannot fulfil it. An order whose tickets were issued is left as it is.
-
Added #
POST /email-senderstakessmtpto send through the account's own mail server, and senders havemode. Each address carries its server assmtp, changed withPOST …/smtpand checked withPOST …/smtp/check. -
Changed #
PATCH /events/{slug}/portals/{id}acceptsslug: new words move the share address to a fresh random tail and the old one stops working.POST /events/{slug}/portals/{id}/regeneratealso givessluga fresh tail.- PATCH
/events/{slug}/portals/{id} - POST
/events/{slug}/portals/{id}/regenerate - OBJECT
Portal - OBJECT
PortalInput
- PATCH
-
Added #
POST /buyers/{ref}/blockstops a buyer's people placing new orders or generating quotes, with an optionalmessage, andDELETE /buyers/{ref}/blocklifts it. Buyers carry the result asblock.- POST
/buyers/{ref}/block - DELETE
/buyers/{ref}/block - GET
/buyers/{ref} - OBJECT
BuyerBlock - OBJECT
BuyerAccountDetail
- POST
-
Added #
Order discounts have
on_addition, true for a code typed when tickets were added to the order after it was placed.- GET
/orders/{ref} - OBJECT
OrderDiscount
- GET
-
Added #
Companion rules have
ticket_type_ids, several companion types any of which count, andper_quantitymay be0for once per order.PUTtakesticket_type_idsorticket_type_id, andper_quantitymust be sent. -
Added #
Audiences have
show_express_checkout, on by default, which offers that page's buyers Apple Pay, Google Pay, Link and PayPal. Card payment is offered either way.- GET
/events/{slug}/audiences/{id} - POST
/events/{slug}/audiences - PATCH
/events/{slug}/audiences/{id} - OBJECT
Audience - OBJECT
AudienceInput
- GET
-
The font
bricolage-grotesqueis replaced byhost-groteskinBadgeDesign.font. A badge saved in it reads back ashost-grotesk, and a write that sends the old key is stored ashost-grotesk.- GET
/events/{slug}/badge-design - PATCH
/events/{slug}/badge-design - OBJECT
BadgeDesign - OBJECT
BadgeDesignInput
- GET
-
Changed #
A free included good that has run out is trimmed to what is left, down to none, instead of refusing the sale:
POST /events/{slug}/ordersno longer answers409sold_outfor it, nor approving an application409good_unavailable. -
Added #
Widgets have
show_promo_field, on unless switched off, which shows or hides the promotion code field in the widget. Codes still work from their links with it off.- GET
/events/{slug}/widgets/{id} - POST
/events/{slug}/widgets - PATCH
/events/{slug}/widgets/{id} - OBJECT
WidgetSummary - OBJECT
WidgetInput
- GET
-
Added #
Document numbering takes a
suffixper kind, printed after the count, on the account's numbering and an event's own. A blanksuffixis no suffix, and anannualreset can take its year from it.
-
Added #
GET /events/{slug}/reports/movedlists who moved between this event and another, andGET /events/{slug}/incomehasmoved_out_cents,moved_outandmoved_infor the money that stays where it was paid. -
Added #
POST /events/{slug}/tickets/movemoves tickets to another event, keeping their refs. A moved ticket hasmoved_from, and an order line for a type at another event haseventandplace_released.- POST
/events/{slug}/tickets/move - GET
/events/{slug}/tickets/{ref} - GET
/orders/{ref} - OBJECT
TicketsMoveResult - OBJECT
Ticket - OBJECT
OrderLine
- POST
-
Added #
Coupons have
shows_only_its_tickets: a buyer who applies one of its codes sees only the ticket types inticket_type_ids. It needsticket_type_ids.- GET
/events/{slug}/coupons/{id} - POST
/events/{slug}/coupons - PATCH
/events/{slug}/coupons/{id} - OBJECT
Coupon - OBJECT
CouponInput
- GET
-
Added #
Ticket types have
pay_what_you_wantandsuggested_price_cents. With it on,price_centsis the least a buyer can pay, and setting it on a ticket type priced by tiers, volume or a bundle answers409pricing_mode.- GET
/events/{slug}/ticket-types/{id} - POST
/events/{slug}/ticket-types - PATCH
/events/{slug}/ticket-types/{id} - OBJECT
TicketType - OBJECT
TicketTypeCreate - OBJECT
TicketTypePatch
- GET
-
order.createdfor a booking-form checkout whose buyer was not told they may be emailed about the event is sent only when the order completes, and not at all if they walk away. Noorder.cancelledfollows an order like that.- GET
/webhooks - OBJECT
WebhookEndpoint
- GET
-
Added #
Webhooks can subscribe to
order.completed, sent once per order when it is paid, placed by bank transfer or made by the organizer, and orders havecompleted_at, when that happened.- GET
/orders/{ref} - GET
/webhooks - OBJECT
Order - OBJECT
WebhookEndpoint
- GET
-
Added #
Each sign-up from
GET /events/{slug}/interesthasname, empty unless the sign-up moved from Tito Classic with one. -
Added #
Event checkout settings have
collect_unfinished, which keeps the email of a buyer who doesn't finish so they can be messaged, and the account'sCheckouthascollect_unfinished_new_events, the starting value for new events.- GET
/events/{slug}/settings/checkout - PATCH
/events/{slug}/settings/checkout - GET
/checkout - PATCH
/checkout - OBJECT
EventCheckoutSettings - OBJECT
EventCheckoutSettingsInput - OBJECT
Checkout - OBJECT
CheckoutInput
- GET
-
Added #
Coupons have
shows_ticket_type_ids, ticket types kept off the event page that a buyer sees once they apply a code, andshows_after_used_up(hideorkeep). A coupon may take 0 off when it only shows tickets.- GET
/events/{slug}/coupons/{id} - POST
/events/{slug}/coupons - PATCH
/events/{slug}/coupons/{id} - OBJECT
Coupon - OBJECT
CouponInput
- GET
-
Added #
Content pages have
portal_placements, set withPOST,PATCHandDELETE /events/{slug}/pages/{id}/portal-placements: a page shows at the top or bottom of a portal page, or as a page of its own withpageown. -
Added #
Portals have
give_out_until, a cut-off after which the holder can no longer send links, assign tickets, upload a list or register people on the share link. Send an RFC 3339 time, or""for none.- GET
/events/{slug}/portals/{id} - POST
/events/{slug}/portals - PATCH
/events/{slug}/portals/{id} - OBJECT
Portal - OBJECT
PortalInput
- GET
-
Added #
GET /events/{slug}/settings/numberingandPATCH /events/{slug}/settings/numberingread and set an event's own document numbering: per-kind prefixes counting from 1 instead of the account's series. -
Added #
TicketType.descriptionaccepts a composer body with bold, italic, links and bullets, and ticket types carrydescription_textanddescription_html, the description as plain lines and as HTML.
-
Changed #
A ticket tier's
soldcounts tickets issued, including those on unpaid orders whose tickets already exist and those added to an order afterwards. -
Added #
An event's registration settings have
capacity: the most tickets the whole event can sell across every ticket type, null for no limit. -
Changed #
GET /events/{slug}/report,GET /events/{slug}/incomeandGET /events/{slug}/reports/couponsalso askfinancials.view. A key that heldevents.viewbefore the split was given it. -
Changed #
Ticket types, offerings, audiences and questions ask
catalog.viewandcatalog.manageinstead ofevents.viewandevents.manage. A key holding an events capability before the split was given its catalog twin. -
Added #
POST /workflowsandPATCH /workflows/{id}takeevents, the slugs of the events a workflow covers, orall_events: truefor every event. Sending both is refused.- POST
/workflows - PATCH
/workflows/{id} - OBJECT
WorkflowInput
- POST
-
Added #
An event's after-registering settings have
invoice_details_daysandinvoice_details_until: the window in which buyers may update their own invoice details from their order page. -
Added #
POST /orders/{ref}/invoice-detailschanges who an order's invoice is made out to; an issued invoice is canceled with a credit note and reissued under a new number.
-
Added #
The account has
close_on: when it is due to be closed, 30 days after its owner asked for it in Account settings, or null. -
Added #
Events have
anonymize_on: when the attendee data the owner asked to anonymize goes.POST /events/{slug}/keep-datatakes that back, and answers409anonymizing_startedonce it has begun.- POST
/events/{slug}/keep-data - OBJECT
Event
- POST
-
Added #
A buyer's people have
sees_all: whether they see every one of the buyer's bookings and quotes, or only their own. Change it withPOST /buyers/{ref}/people/{email}/sees.- POST
/buyers/{ref}/people/{email}/sees - OBJECT
BuyerPerson
- POST
-
Added #
GET /unsubscribeslists everyone who asked to stop getting the account's messages, from one event or from every message the account sends.- GET
/unsubscribes - OBJECT
Unsubscribe
- GET
-
Added #
ask_companytakesorganizations, for an event that sells to organizations only, andcompany_fieldssets each organization detail tohidden,optionalorrequired. -
Added #
Messages count
delivered,waiting,bounced,not_sentandmarked_as_spam, outbox emails havedelivery,delivery_reasonandfixed_to, andGET /events/{slug}/outboxtakes?status=delivered|didnt_arrive|waiting.- GET
/events/{slug}/messages - GET
/events/{slug}/messages/{id} - GET
/events/{slug}/outbox - GET
/events/{slug}/outbox/{id} - OBJECT
Message - OBJECT
OutboxEmail
- GET
-
Added #
Email senders have
not_sendingandnot_sending_since: a live sender whose last send was refused, and whose email goes from Tito's own address until a send goes through again.- GET
/email-senders - GET
/email-senders/{id} - OBJECT
EmailSender
- GET
-
Added #
-
Added #
GET /data-protection-loglists the account's data-protection actions, newest first: each person anonymized, each event deleted or anonymized, and each event deletion, event anonymizing or account closing asked for or taken back. -
Added #
POST .../anonymizeon a ticket, order, invitation, customer, waitlist entry or ticket request removes the person and answers anAnonymizeResult. Each record hasanonymized_at.- POST
/tickets/{ref}/anonymize - POST
/orders/{ref}/anonymize - POST
/events/{slug}/invitations/{id}/anonymize - POST
/buyers/{ref}/anonymize - POST
/events/{slug}/waitlist/{id}/anonymize - POST
/events/{slug}/applications/{id}/anonymize - OBJECT
AnonymizeResult - OBJECT
Ticket - OBJECT
Order - OBJECT
Invitation - OBJECT
BuyerAccount - OBJECT
WaitlistEntry - OBJECT
WaitlistEntryDetail - OBJECT
Application
- POST
-
Added #
An event's after-registering settings have
reply_to: where replies to the event's email go, ahead of the sending address's own Reply-To.""follows the address. -
The
homagetheme isclassic:look_themereadsclassicfor a design that started from it, andPOST /design/themetakes either word. Compare againstclassic.- POST
/design/theme - POST
/events/{slug}/design/theme - PATCH
/design
- POST
-
Added #
Tickets and invitations have
duplicate: a ticket whose attendee's own email is on valid tickets in two or more orders at the event, or an invitation sharing its email with another on the event. -
Added #
Designs have the
layout_cardstoken (one,beloworeach) and thepage_widthtoken (fitorwide), andlayout_datetakeslines.- PATCH
/design - PATCH
/events/{slug}/design - OBJECT
DesignToken
- PATCH
-
Resending an order confirmation or a ticket email to the same address within two minutes of the last send answers
409recently_sentand sends nothing. Wait two minutes before sending it again. -
Added #
Events have
calendar_on_event_page: whether the event page offers Add to calendar beside its date, before anybody books. Set it withPATCH /events/{slug}.- GET
/events/{slug} - PATCH
/events/{slug} - OBJECT
Event - OBJECT
EventPatch
- GET
-
Added #
POST /events/{slug}/tickets/{ref}/rescheduleanswersbooker_mail_statusandbooker_email, for the notenotifysends a booker who is not the attendee. -
Added #
DELETE /events/{slug}deletes an event nothing records, and answers409event_has_recordsotherwise.Event.delete_onsays when an event the owner asked to delete goes, andPOST /events/{slug}/keeptakes that back.- DELETE
/events/{slug} - POST
/events/{slug}/keep - OBJECT
Event
- DELETE
-
Added #
A message's
audiencecan besignups: everyone who confirmed a sign-up on one of the event's widgets that collect emails, never anyone who withdrew.- POST
/events/{slug}/messages - PATCH
/events/{slug}/messages/{id} - OBJECT
Message
- POST
-
POST /eventsrefusestimezoneLocalwith422invalid_timezone, and a date at a time the clocks skip in the event's timezone withinvalid_dates. Send an IANA zone such asEurope/Dublin.- POST
/events - OBJECT
EventCreate
- POST
-
Added #
Events have
archivedandarchived_at, andGET /eventstakes?archived=trueor?archived=falseto list only archived or only unarchived events. Any other value answers422invalid_query.- GET
/events - GET
/events/{slug} - OBJECT
Event
- GET
-
Added #
MessageFile.deliverycan beoffline: Tito took the file offline, so it is sent neither attached nor as a link, and adds no weight.- OBJECT
MessageFile
- OBJECT
-
Added #
Details have
in_calendar: whether the detail's value goes into every calendar entry written for an event. Set it onPOST /detailsorPATCH /details/{id}.- GET
/details - POST
/details - GET
/details/{id} - PATCH
/details/{id} - OBJECT
Detail - OBJECT
DetailInput - OBJECT
DetailPatch
- GET
-
Added #
POST /design/from-siteandPOST /events/{slug}/design/from-sitetakelayout, defaulttrue, which writes the layout the website's shape suits. Sendfalseto leave the layout as it is. -
Added #
POST /events/{slug}/downloadsanswers507storage_fullwhen the account has used all of its file storage. Remove files, or ask Tito support for more.
-
Added #
An event's payment settings have
hold_minutes, 5 to 60: how long a buyer's selection is held while they fill in their details. A hold is extended while nobody else is waiting for the tickets. -
Added #
Audiences have
organizations_only, so every booking is made out to an organization,ask_vat(on by default) for the VAT number box, andcountries, the ISO 3166-1 alpha-2 codes buyers can be in, empty for any.- GET
/events/{slug}/audiences - POST
/events/{slug}/audiences - GET
/events/{slug}/audiences/{id} - PATCH
/events/{slug}/audiences/{id} - OBJECT
Audience - OBJECT
AudienceInput
- GET
-
Added #
Ticket types read back what
PATCHtakes:description,tax_rate_id,price_includes_tax,color,max_per_order,allow_downgrade,holder_changes_mode,holder_changes_until,anonymousandqr_enabled. -
Added #
Goods and donations read back
description,tax_rate_id,price_includes_tax,allow_post_order,assign_to_ticket,sales_start_atandsales_end_at.PATCHtakes the sale window as RFC 3339 ornulltoo. -
A message
segmentwith a key the compose page has no filter for, or a value of the wrong type, is422invalid_bodynaming it, where it used to be stored as no narrowing. Sendtypeas a number.- POST
/events/{slug}/messages - PATCH
/events/{slug}/messages/{id} - OBJECT
MessageInput
- POST
-
Added #
Events have
ends_at,all_dayanddate_text, asPATCH /events/{slug}takes them. ThatPATCHalso takesstarts_atandends_atin RFC 3339 with an offset, the form the read answers.- GET
/events - GET
/events/{slug} - PATCH
/events/{slug} - OBJECT
Event - OBJECT
EventPatch
- GET
-
Added #
A
booldesign token takes"true"and"false"as well as"1"and"0", and stores them as"1"and"0".- PATCH
/design - PATCH
/events/{slug}/design - OBJECT
DesignToken - OBJECT
AccountDesignInput
- PATCH
-
POST /events/{slug}/quotesrefuses an extra sold only with a ticket when none of its tickets is on the quote, with422needs_ticket, instead of failing at convert. Add one of its tickets to the quote. -
Changed #
POST /events/{slug}/quotesprices a line at the ticket type's volume band its quantity reaches, after group discounts and before tax. Aunit_price_centsyou send still wins over the band. -
Added #
Order lines have
charged_quantity: how many ofquantitywere paid for, fewer when a group discount or a free-with rule gave some away.total_centsisunit_price_centstimes it, plus any tax added on top.- GET
/orders/{ref} - OBJECT
OrderLine
- GET
-
Added #
Badge boxes take
size_pt, a size of the box's own in points from 9 to 200, overridingsame_size; the text prints smaller only where a long value needs it. 0 or absent sets it as large as it fits.- GET
/events/{slug}/badge-design - PATCH
/events/{slug}/badge-design - OBJECT
BadgeBox - OBJECT
BadgeBoxInput
- GET
-
Added #
Connections have
livemode: on a connected Stripe row,truefor a live Stripe account andfalsefor a Stripe sandbox. Null on every other row.- GET
/connections - GET
/connections/{service} - GET
/events/{slug}/connections - OBJECT
Connection
- GET
-
Added #
Ticket types have
show_left_at: how few have to be left before the event page and the widget say how many. 0, the default, never says. -
Added #
Ticket types have
hide_free: the event page and the widget leave the word Free off a free ticket. Setting it on a priced ticket, or one with a price ladder, is422. -
Added #
An event's sales settings have
min_tickets_per_orderandmax_tickets_per_order, 0 to 500, with 0 for no limit. Only tickets count, and a bundle counts as the tickets inside it. -
Added #
GETandPATCH /events/{slug}/settings/automated-emailsread and replaceswitched_off, the automated emails an event doesn't send.switchablelists those that can be switched off; naming any other is422. -
Added #
- GET
/events/{slug}/design - PATCH
/events/{slug}/design - OBJECT
DesignToken
- GET
-
Added #
In test mode, a write to a portal or an invitation list that came from the live account is refused with
test_mode_from_live: change it in live. One made in test mode can be changed there.- OBJECT
Error
- OBJECT
-
Added #
POST /events/{slug}/checkin-liststakesticket_type_idsto check in only those ticket types, set when the list is created. Lists haveticket_types_limitedandticket_type_ids, and a ticket of another type is422not_eligible. -
Added #
POST /events/{slug}/invitations/{id}/approveopens an invitation waiting on approval and emails it, answering the invitation and itsdelivery.POST …/rejectturns it down. Either is409not_decidablewhen the invitation isn't waiting. -
Added #
POST /events/{slug}/invitations/{id}/cancel-ticketscancels every ticket a claimed invitation issued. On a paid invitationrefundis required:truesends the money back,falsekeeps it.emailsends the invitee the cancellation email. -
Added #
Tickets have
confirmed_at: when the attendee said they are still coming from a message, null until they do. A message'ssegmenttakesconfirmed,yesorno, to reach them or whoever hasn't answered.- GET
/events/{slug}/tickets - GET
/events/{slug}/tickets/{ref} - POST
/events/{slug}/messages - PATCH
/events/{slug}/messages/{id} - OBJECT
Ticket - OBJECT
Message - OBJECT
MessageInput
- GET
-
Added #
Badge boxes take
organizer(the account's name) andlogo(the event's logo) keys. On a positioned design, the badge design'slogoswitches thelogobox on or off; on a stack design it is stored and prints nothing.- GET
/events/{slug}/badge-design - PATCH
/events/{slug}/badge-design - OBJECT
BadgeDesign - OBJECT
BadgeDesignInput - OBJECT
BadgeBox - OBJECT
BadgeBoxInput
- GET
-
Added #
A message's
segmenttakespicked, a comma-separated list of up to 2000 ticket references: only those tickets, or whoever booked them, get the message.- POST
/events/{slug}/messages - PATCH
/events/{slug}/messages/{id} - OBJECT
Message - OBJECT
MessageInput
- POST
-
PATCH /events/{slug}/badge-designanswers409unsaved_badge_changeswhile someone has unsaved changes in Badge settings, and changes nothing. Retry once those changes are saved or discarded.- PATCH
/events/{slug}/badge-design - OBJECT
BadgeDesignInput
- PATCH
-
Added #
POST /tickets/{ref}/cancelcancels one ticket without a refund and puts its place back on sale. A ticket it can't cancel is409not_cancelablewith the reason.- POST
/tickets/{ref}/cancel - OBJECT
TicketCancelResult
- POST
-
Added #
POST /design/from-siteandPOST /events/{slug}/design/from-sitestart a design draft from a website'surl: its colors, closest font, logo, and header and footer links. A site that can't be used is422with asite_err_*code, and over 6 reads in 10 minutes429.- POST
/design/from-site - POST
/events/{slug}/design/from-site - OBJECT
AccountDesign
- POST
-
Added #
The design takes
order_page_order, the order page's main column in order (items,details,tickets,qrandchange, as a comma list), andticket_page_order, what follows the ticket on its page (scheduleanddetails, in either order).- GET
/design - PATCH
/design - GET
/events/{slug}/design - PATCH
/events/{slug}/design - OBJECT
DesignToken - OBJECT
AccountDesignInput
- GET
-
Added #
Invitations have
cc: up to 10 addresses copied in on every email the invitee gets, on a visible Cc line. Eachemail_historyrecord carries theccthat email went to. -
Added #
Content pages have
ticket_type_ids: the ticket types a piece is for, empty for everyone. The order page, the order confirmation, the ticket page and the ticket email show the piece only to holders of those types.- GET
/events/{slug}/pages - POST
/events/{slug}/pages - GET
/events/{slug}/pages/{id} - PATCH
/events/{slug}/pages/{id} - OBJECT
StaticPage - OBJECT
StaticPageInput
- GET
-
The
confettitheme issprinkles:look_themereadssprinkleson a design that started from it, and the theme endpoints takesprinkles. Compare and sendsprinklesinstead.- POST
/design/theme - POST
/events/{slug}/design/theme - PATCH
/design
- POST
-
Added #
Badge boxes have
same_size: set, the box prints at one size on every badge, the largest the event's longest value fits.- GET
/events/{slug}/badge-design - PATCH
/events/{slug}/badge-design - OBJECT
BadgeBox - OBJECT
BadgeBoxInput
- GET
-
Added #
Badge boxes take
first_nameandlast_namekeys, the name in two parts, andmatch_name_partssets whether the two print at one size (true by default). A badge needs a name on, whole or split: with either part on,namemay be off.- GET
/events/{slug}/badge-design - PATCH
/events/{slug}/badge-design - OBJECT
BadgeBox - OBJECT
BadgeBoxInput
- GET
-
Added #
The design takes layout tokens, drafted and published like any other:
layout_header,layout_date,layout_tickets,layout_total,layout_spacingandlayout_ticket, pluscard_price_ink. Starting from a theme writes its layout tokens too.- GET
/design - PATCH
/design - GET
/events/{slug}/design - PATCH
/events/{slug}/design - POST
/design/theme - POST
/events/{slug}/design/theme - OBJECT
DesignToken - OBJECT
AccountDesignInput
- GET
-
Added #
An event's checkout settings have
terms_url: the organizer's own terms and conditions page, linked from the end of the booking form, or an empty string for none. Set it withPATCH /events/{slug}/settings/checkout. -
Added #
The theme endpoints take a twelfth theme,
homage, and a badge design'sfonttakessource-sans-3.- POST
/design/theme - POST
/events/{slug}/design/theme - GET
/events/{slug}/badge-design - PATCH
/events/{slug}/badge-design - OBJECT
BadgeDesign - OBJECT
BadgeDesignInput
- POST
-
Added #
POST /design/themeandPOST /events/{slug}/design/themestart a design draft from a theme: sendtheme, one of thelook_themetoken's options. The theme's colors, fonts, buttons and decoration go into the draft, and nothing is published.- POST
/design/theme - POST
/events/{slug}/design/theme - OBJECT
AccountDesign
- POST
-
Added #
/design/document-cssand/events/{slug}/design/document-cssread and set a stylesheet for invoices, receipts, refund receipts and printed tickets. The pages' stylesheet never reaches them. -
Added #
The
date_formatdesign token takescustom, which draws thedate_patterntoken: up to 64 characters in whichd,mandystand for the day, month and year. A pattern with none of them is refused.- GET
/design - PATCH
/design - GET
/events/{slug}/design - PATCH
/events/{slug}/design - OBJECT
DesignToken
- GET
-
Added #
BadgeDesign.fonttakesmanrope,source-serif-4,instrument-serif,ibm-plex-mono,big-shoulders-displayandnunito.- GET
/events/{slug}/badge-design - PATCH
/events/{slug}/badge-design - OBJECT
BadgeDesign - OBJECT
BadgeDesignInput
- GET
-
Added #
After-registering settings have
receipt_delivery:attach,linkornone, how the order confirmation hands over a paid order's receipt. -
Added #
Event design tokens include
print_extras: what the printed ticket prints after the ticket type and name, as a comma list offield:<id>,session:<id>andgood:<id>. An id the event can't print is refused with a422naming it.- GET
/events/{slug}/design - PATCH
/events/{slug}/design - OBJECT
DesignToken
- GET
-
Added #
POST /events/{slug}/tickets/{ref}/resendandPOST /orders/{ref}/confirmationanswermail_status: "queued"when the event attaches tickets as a PDF. The email goes out within five minutes. -
A
manifest_tomlnaming a setting a theme file does not have is refused with422 invalid_bodynaming it, where it used to be dropped silently. The accent font is gone: taketype.accentout of a theme file, though an emptyaccent = ""still imports.- POST
/looks - PATCH
/looks/{id} - OBJECT
Look - OBJECT
LookInput
- POST
-
Added #
GET /orders/{ref}includesextra_payments: payments an order took and could not use, such as a second payment for an order already paid.DELETE /orders/{ref}answers409 refund_firstwhile one is unrefunded.- GET
/orders/{ref} - DELETE
/orders/{ref} - OBJECT
OrderExtraPayment
- GET
-
Added #
Audiences have
show_bank_transfer: whether their buyers are offered bank transfer when the event offers it. On by default.- GET
/events/{slug}/audiences/{id} - POST
/events/{slug}/audiences - PATCH
/events/{slug}/audiences/{id} - OBJECT
Audience - OBJECT
AudienceInput
- GET
-
Content pages have
has_unpublished_changes. While it is true,PATCH /events/{slug}/pages/{id}, and a translation naming the page, answer409 unpublished_changesand write nothing: publish or discard the changes in the admin first. -
Added #
POST /orders/{ref}/confirmationcan answermail_status: "queued"when the email carries a receipt or invoice PDF. It goes out within five minutes. -
Added #
Widgets have
full_page_link, on by default: whether the widget's checkout shows an "Open the full page" link in its footer.- GET
/events/{slug}/widgets/{id} - POST
/events/{slug}/widgets - PATCH
/events/{slug}/widgets/{id} - OBJECT
WidgetSummary - OBJECT
WidgetInput
- GET
-
Fixed #
POST /events/{slug}/duplicatewith a blankslugpicks one for a name over 60 characters or with no Latin spelling, rather than refusing it.- POST
/events/{slug}/duplicate - OBJECT
EventDuplicate
- POST
-
Added #
Registration settings have
require_holder_answers: on, a ticket the booker gives to somebody else must have its required questions answered before it is sent.
-
Added #
Coupons have
combinable,trueby default. Withfalse, a code of the coupon can only be the one code on an order.- GET
/events/{slug}/coupons/{id} - POST
/events/{slug}/coupons - PATCH
/events/{slug}/coupons/{id} - OBJECT
Coupon - OBJECT
CouponInput
- GET
-
Added #
GET /events/{slug}/outboxlists the emails sent to an event's people, filtered bymessage_id,statusorq. Messages havekind,bulkorindividual, andGET /events/{slug}/messagestakes?kind=.- GET
/events/{slug}/outbox - GET
/events/{slug}/outbox/{id} - GET
/events/{slug}/messages - OBJECT
OutboxEmail - OBJECT
OutboxEmailDetail - OBJECT
Message
- GET
-
Added #
Quotes have
promo_codes: every code the quote was priced with, in order, each with itsdiscount_cents.promo_codestays the first.- GET
/events/{slug}/quotes - GET
/events/{slug}/quotes/{ref} - OBJECT
Quote
- GET
-
Added #
GET /events/{slug}/invitations/{id}includesemail_history, the emails sent for the invitation. List responses leave it out. -
Added #
POST /events/{slug}/design/liftcopies an event's published look into the account's design draft. Tokens that belong to the event alone stay behind, and nothing is published.- POST
/events/{slug}/design/lift - OBJECT
AccountDesign
- POST
-
An invitation's
statusisdraftorsentwhere it used to bepending.sentmeans the send succeeded, not that the email reached an inbox. Match on both in place ofpending.
-
Added #
Buyers have
domains, email domains whose addresses belong to them before anyone signs in. Add one withPOST /buyers/{ref}/domains. An order confirmed for a customer at checkout carriescustomer_confirmed.- POST
/buyers/{ref}/domains - DELETE
/buyers/{ref}/domains/{domain} - GET
/buyers/{ref} - GET
/orders/{ref} - OBJECT
BuyerAccountDetail
- POST
-
Added #
Event wording takes
terms, a set of payment terms' id, to read and change those terms' own invoice email wording:?terms=onGET,termsin aPATCH, andper_termson each row.audienceandtermstogether are refused withinvalid_scope.- GET
/events/{slug}/design/wording - PATCH
/events/{slug}/design/wording - OBJECT
DesignWording - OBJECT
DesignWordingRow - OBJECT
DesignWordingInput
- GET
-
Changed #
Every
admin_urlis an absolute URL, on a standalone account too, where it used to be a relative path.- GET
/events/{slug} - GET
/buyers/{ref} - OBJECT
Event - OBJECT
BuyerAccount - OBJECT
BuyerQuoteSummary - OBJECT
BuyerOrderSummary - OBJECT
CustomPage - OBJECT
ThemeFile
- GET
-
Added #
Event wording takes
audience, an audience's slug, to read and change that audience's own wording on top of everyone's:?audience=onGET,audiencein aPATCH. Rows say which lines can be worded per audience withper_audience.- GET
/events/{slug}/design/wording - PATCH
/events/{slug}/design/wording - OBJECT
DesignWording - OBJECT
DesignWordingRow - OBJECT
DesignWordingInput
- GET
-
Added #
Buyers have
billing: who an invoice is made out to, its postal address,vat_numberand references. Set it withPOST /buyersorPATCH /buyers/{ref}, field by field, where""clears one.- POST
/buyers - PATCH
/buyers/{ref} - GET
/buyers/{ref} - OBJECT
BuyerBilling - OBJECT
BuyerAccountDetail
- POST
-
Fixed #
A download's
urlpoints at the root domain, where admin is, rather than at the account's own address, which only redirected.- GET
/events/{slug}/downloads - POST
/events/{slug}/downloads - OBJECT
Download
- GET
-
Added #
Design tokens include
time_format:24hor12h, the clock buyers read times on.- GET
/design - PATCH
/design - GET
/events/{slug}/design - PATCH
/events/{slug}/design - OBJECT
DesignToken
- GET
-
Added #
POST /buyers/{ref}/peopletakescontact, a contact's ref, in place ofemail. An unknown ref answers422 unknown_contact. -
Added #
Buyers have
bank_details, the account Stripe issues them to pay bank transfers into.POST /buyers/{ref}/bank-detailsfetches them from Stripe and keeps them.- POST
/buyers/{ref}/bank-details - GET
/buyers/{ref} - OBJECT
BuyerAccountDetail
- POST
-
Added #
POST /events/{slug}/portalswith neitherallocationnorticket_typesmakes a portal with no tickets, whoseallocationis0. APATCHsending it anallocationis refused withno_tickets.- POST
/events/{slug}/portals - PATCH
/events/{slug}/portals/{id} - OBJECT
Portal
- POST
-
Added #
DELETE /events/{slug}/portals/{id}deletes a portal nobody has used, with its set-up. A used one answers409 portal_in_use. -
Added #
Quotes can need approval:
POST /buyers/{ref}/po-requiredturns it on, aQuotegainssubmittedandrejectedstatuses withneeds_approval,approvalandbuyer, andpo_numberon convert records the approving purchase order. -
Added #
Buyers have a
phone, stored as typed. Set it withPOST /buyersorPATCH /buyers/{ref}, where an emptyphoneclears it.- POST
/buyers - PATCH
/buyers/{ref} - GET
/buyers/{ref} - OBJECT
BuyerAccount
- POST
-
Added #
POST /buyersadds a buyer, andPOST /buyers/{ref}/stripe-customerlinks one to a customer that already exists in the account's Stripe.- POST
/buyers - POST
/buyers/{ref}/stripe-customer - OBJECT
BuyerAccountDetail
- POST
-
Added #
POST /buyers/{ref}/primarymakes one of a buyer's people its primary contact. The previous one stays on as one of its people.- POST
/buyers/{ref}/primary - OBJECT
BuyerPerson
- POST
-
Added #
Widgets have
all_ticket_types_link: a widget limited to some ticket types ends its list with an "All ticket types" link that reopens it showing every type on sale.- GET
/events/{slug}/widgets/{id} - POST
/events/{slug}/widgets - PATCH
/events/{slug}/widgets/{id} - OBJECT
WidgetSummary - OBJECT
WidgetInput
- GET
-
Added #
Buyers have a
kind, a label from the account's own list. Manage the list with/buyer-kindsand set a buyer's withPOST /buyers/{ref}/kind.- GET
/buyer-kinds - POST
/buyer-kinds - GET
/buyer-kinds/{id} - PATCH
/buyer-kinds/{id} - DELETE
/buyer-kinds/{id} - POST
/buyers/{ref}/kind - OBJECT
BuyerAccount - OBJECT
BuyerKind - OBJECT
BuyerKindDetail
- GET
-
Fixed #
A message's
segment.sincedate begins at midnight in the event's timezone, as the orders list's does, rather than on the server's clock.- POST
/events/{slug}/messages - PATCH
/events/{slug}/messages/{id} - OBJECT
Message - OBJECT
MessageInput
- POST
-
Added #
Invitation question fields list
ticket_types, the ticket types that ask each question, and anappearanceofdefaultasks it the way the ticket does.optionalis refused for a question a ticket type requires.- GET
/events/{slug}/settings/invitations/fields - PATCH
/events/{slug}/settings/invitations/fields - GET
/events/{slug}/invitation-lists/{id}/settings/fields - PATCH
/events/{slug}/invitation-lists/{id}/settings/fields - GET
/events/{slug}/invitations/{id}/settings/fields - PATCH
/events/{slug}/invitations/{id}/settings/fields
- GET
-
A Content page's
publishedsays only whether its own address opens: a placed piece shows either way, and placing one shows it at once rather than with the design publish.titleis optional, andtitle_requiredis gone.- GET
/events/{slug}/pages - POST
/events/{slug}/pages - PATCH
/events/{slug}/pages/{id} - POST
/events/{slug}/design/publish - OBJECT
StaticPage - OBJECT
StaticPageInput
- GET
-
POST /orders/{ref}/cancelanswers409 cancel_failedwhen a payment is unsettled or in conflict, such as a capture in flight, and502 cancel_failedfor any other failure. Read the errorcode, not the status alone. -
Added #
Invoicing.vendor_signaturesays whether vendor forms carry the account's signature, andvendortakesseller_signatory, the name printed under it.- GET
/invoicing - PATCH
/invoicing - OBJECT
Invoicing - OBJECT
InvoicingInput
- GET
-
Added #
Portals have
package_tax_rate_idandpackage_price_includes_tax: the VAT rate a package fee is charged at, and whetherpackage_centsincludes it. Both are refused withpackage_billedwhile a bill stands.- GET
/events/{slug}/portals/{id} - POST
/events/{slug}/portals - PATCH
/events/{slug}/portals/{id} - OBJECT
Portal - OBJECT
PortalInput
- GET
-
Added #
A portal's
capabilitiescan listchange_type,buy_more,teamandnames_only, set in the admin and read here. Unlocking a portal whoseteamcapability is on (access_locked: false) is refused withteam_locked.- GET
/events/{slug}/portals - GET
/events/{slug}/portals/{id} - PATCH
/events/{slug}/portals/{id} - OBJECT
Portal - OBJECT
PortalInput
- GET