Tito API v1 reference

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: September 2026

  1. Added

    PATCH /buyers/{ref} sets a buyer's name and org, either or both; a body with neither is 422 invalid_body. Invoices already issued keep what they were issued with.

  2. Added

    POST /buyers/{ref}/part-of makes a buyer part of another, one level deep (409 part_of_another or has_buyers), or null for none. Buyers have part_of; a detail has includes and inherited_terms, the payment terms it follows from the buyer it is part of.

  3. Added

    A sender's DNS records each carry found: whether the last check found that record. Every record on a live sender reads true.

  4. Added

    Wording rows have formattable: the line may carry bold, italic, bullets and links, and once formatted its draft and published values are a composer body rather than a plain sentence.

  5. Fixed

    PATCH /events/{slug} accepts the slug the event is already at as it is, so an imported one with a capital letter can be sent back unchanged. A new slug is still lowercase letters, digits and hyphens.

  6. Added

    Messages, invitation sends and order and ticket resends take email_sender_id and email_sender_address_id: the sender the email goes from, 0 for the event's. One that isn't live is 422 invalid_body.

  1. Changed

    A created order's payment_url and url are at the account's own address (the event's own domain when it has one) rather than the address the request came in on. Treat both as opaque capability URLs.

  2. Added

    A sender has addresses, several From addresses on one verified domain, each with a reply_to: POST /email-senders/{id}/addresses adds one, DELETE …/{address_id} removes it, POST …/{address_id}/default picks it. An event chooses one with email_sender_address_id.

  3. Added

    Widgets have share_buyer: hands the buyer's name and email address to the page's own tito("on:registration:finished", …) subscribers. Off by default.

  4. Added

    /payment-terms manages named payment terms: anchor (order, event or before_event), days, reminder_days, overdue_days, auto_cancel_days. POST /buyers/{ref}/terms puts a buyer on one (0 for the event's own settings), read as BuyerAccountDetail.terms.

  5. Added

    Widgets have banner ("", event, an https image URL or asset:<id>), show_event_name, show_date, show_venue and show_descriptions: what shows above and under the ticket list.

  6. Added

    An invitation's state can be awaiting_approval or rejected, the organizer's decision on a registration that needs approval. POST /events/{slug}/invitations/{id}/send answers 409 not_claimable for either.

  1. Changed

    A resend's note may carry details such as {{ person.first_name }}, {{ order.reference }} or {{ ticket.type }}, resolved for the buyer or the ticket's holder, beside its {{ mark.bold }} style marks.

  2. Added

    GET /events/{slug}/waitlist takes ?kind= (ticket, workshop, all) and ?session_id=. A workshop entry has session_id, session_name, offering_id, offering_name and ticket_ref, ticket_type_id null. Session offerings take waitlist and waitlist_head_start.

  1. Added

    Terminal readers have collect_name and collect_email: whether the reader offers an optional name or email field before payment. A supplied email receives the order confirmation.

  2. Changed Breaking

    checkout_mode reads hosted or custom; the retired embedded reads back as custom, and is still accepted on a PATCH and stored as custom. Treat embedded and custom as one.

  3. Added

    A buyer's people lists everyone who signs in as it, the primary contact first. POST /buyers/{ref}/people adds an address (409 already_on if already there; one address may be on several buyers) and DELETE /buyers/{ref}/people/{email} removes one (409 primary_contact).

  1. Added

    POST /events/{slug}/waitlist/offer offers a place by hand, by ids or the next people waiting for a ticket_type_id, held for hold_hours; POST …/waitlist/{id}/withdraw takes it back. Ticket types have waitlist_mode; entries have held_until and offered_by.

  2. Added

    Terminal readers have ticket_type_ids: the ticket types offered on the Door page, null for every saleable type and [] for none. Omit it on a PATCH to leave it unchanged.

  3. Added

    POST /orders/{ref}/due-date gives the buyer of an order awaiting a bank transfer more time: due_date is a day on the event's clock, after today and the current due date (422 due_date_too_early). 409 not_awaiting or places_gone when it can't move.

  4. Added

    Events have updated_at: when the event's content last changed, or null.

  5. Added

    Badge designs have font, one of fonts: the fonts an event's pages can be set in. inter unless the event chose another.

  6. Added

    PATCH /fields/{id} takes kind to change a question's type, never to or from file. Refused with 409 answers_do_not_fit, conditions_depend_on_answers or field_changed, and 422 invalid_kind or choices_required.

  1. Added

    Event.map_provider takes osm (OpenStreetMap) and auto (Apple Maps on Apple devices, OpenStreetMap on Linux, Google Maps elsewhere) beside google and apple. device, an earlier name for auto, is accepted and stored as auto.

  2. Added

    Ticket types have waitlist_head_start (minutes between offer emails: 15, 30, 60, 120, 360 or 1440), available and waitlist_held; waitlist is refused on a bundle or a timetabled type. Waitlist entries carry offered_at, took_at, order_id and order_ref.

  3. Deprecated

    Widgets have opening, deprecated on arrival: it reads push, and a POST or PATCH sending it is accepted and ignored. The depth and blur values it offered for two days are gone; every widget opens with push.

  4. Added

    A field's kind can be country, with country_only (the countries offered) and country_pinned (those heading the list), both ISO 3166-1 alpha-2 codes. A country answer is a code, not a name; POST /events/{slug}/orders refuses a name.

  5. Added

    Application pages have public_description: plain text under the heading, a blank line starting a new paragraph, "" for none.

  6. Added

    PATCH /events/{slug}/badge-design takes boxes, the badge as positioned boxes in millimetres, which positions a design that was a stack; lines on a positioned design is 422 design_is_positioned. BadgeDesign.ignored lists what a PATCH accepted and did nothing with.

  1. Added

    POST /widget-domains approves a website before the widget has loaded there. domain takes a host or a URL and is stored as the bare host; the row starts approved with sightings 0.

  2. Changed Breaking

    WidgetDomain.first_seen_at and last_seen_at are null on a website added by hand that the widget has not loaded on yet. Read both as nullable.

  3. Added

    Coupons have limit_unit: whether one use of a limited code is an order (orders) or a ticket (tickets). It cannot change once a code has been used, and a PromoCode's uses count tickets when it is tickets.

  4. Added

    Coupon.rounding says how a percentage settles a part of a cent on each ticket: down, or half_up and half_down for a coupon carried from Tito Pro or Tito Classic. Read only.

  5. Added

    A message's audience can be waitlist: everyone on the event's waitlists who has not left, each copy ending with that person's own link to leave.

  6. Added

    BadgeDesign has positioned, whether the badge is laid out as boxes rather than the stack in lines, and boxes, each a BadgeBox placed in millimetres on the card; for a stacked design, boxes is the layout the badge editor would open it with.

  7. Added

    GET /events/{slug}/waitlist lists who is waiting for a ticket type, narrowed by ?ticket_type_id=, ?state= and ?q=; POST adds someone and POST .../{id}/remove takes them off. TicketType.waitlist opens one when a type sells out; fields attach to a waitlist target.

  8. Added

    TicketType.legacy_slug and WidgetSummary.legacy_token carry a Tito Pro ticket type's slug and widget token over from the account import, so a website moving from Tito Pro keeps its data-tito-token and data-tito-q-<slug>. Empty for anything made in Tito Go.

  1. Added

    An account holds several sending addresses: GET and POST /email-senders, GET and DELETE /email-senders/{id}, POST .../check and POST .../default. EmailSender has id and is_default, /email-sender is the default, and an event's email_sender_id picks its own.

  2. Added

    PUT /email-sender answers 409 domain_claimed when the domain already sends from another Tito account or is verified with the mail service by somebody else. A retry does not change it; Tito support can move a sender between accounts.

  3. Added

    DesignStylesheet has draft_blocked and published_blocked: what the stylesheet uses that the root domain refuses, such as url(), @import or a property off the allow-list. The account's own address serves it as written.

  4. Added

    POST /orders/{ref}/confirmation sends the buyer their order confirmation again, with an optional subject, preview and note. An unpaid order answers 409 not_paid and one with nobody to send to 409 no_email.

  5. Added

    POST /events/{slug}/tickets/{ref}/resend takes an optional body: a subject, an inbox preview line and a note under the greeting, up to 2000 characters (422 note_too_long). With no body it is the ticket email as it stands.

  6. Added

    POST /api-keys mints a delegated key with a subset of the caller's capabilities for expires_in_days (1 to 30); its secret appears only in the 201. APIKey.parent_key_id names the key that delegated it, null for one made in the admin. Revoking the parent revokes them.

  7. Added

    POST /connections/{service}/credentials stores a pasted provider key and POST /connections/{service}/authorize starts browser consent, answering a short-lived URL; GET /events/{slug}/connections lists an event's providers, with credentials and disconnect per service.

  1. Added

    GET /webhooks/{id}/secret reads a webhook's signing secret and POST /webhooks/{id}/rotate-secret (with confirmed: true) replaces it; the old secret stops working at once. Both answer Cache-Control: no-store and are left out of the API log.

  2. Changed Breaking

    The GET /export/db snapshot has webhook signing secrets, card-reader credentials, API-key hashes, preview capabilities, review links and stored API request and response bodies removed. Reissue them before using the snapshot as a live database.

  3. Added

    GET and PATCH /design/wording and /events/{slug}/design/wording read and stage Customize wording per ?locale=, one key and form at a time, and PATCH .../wording/visibility hides or shows a hideable string. Nothing reaches a buyer until the design is published.

  4. Added

    GET and PUT /design/css and /events/{slug}/design/css read and set the scope's own stylesheet, draft and published side by side. PUT writes the Customize draft only; publishing the design makes it public.

  5. Added

    GET, PUT and DELETE /events/{slug}/ticket-types/{id}/bands read, replace and remove a ticket type's volume prices: each band's price_cents applies to every ticket in the order from from_qty up. PUT replaces the base price_cents and quantity too.

  6. Added

    GET, PUT and DELETE /events/{slug}/ticket-types/{id}/tiers read, replace and remove a ticket type's price tiers; DELETE takes the flat price_cents and quantity that replace them. starts_at and ends_at are Unix seconds, 0 meaning no bound.

  7. Added

    GET, PUT and DELETE /events/{slug}/ticket-types/{id}/bundle read, replace and remove a ticket type's bundle of tickets and goods with its discount. A type priced by tiers or volume bands is refused; remove those first.

  8. Changed

    POST /events/{slug}/ticket-types and PATCH /events/{slug}/ticket-types/{id} refuse a price_cents or prices amount above 99,999,999 whole currency units with 422 invalid_body, the cap the admin form applies.

  9. Added

    POST /events/{slug}/coupons/{id}/codes/import imports a batch of up to 500 codes, DELETE .../batches/{batchID} removes one, POST .../duplicate copies a coupon with fresh codes, and GET /events/{slug}/reports/coupons reads coupon usage in one ?currency=.

  10. Added

    POST /fields/order reorders the account's field library and POST /events/{slug}/fields/order reorders the questions on one target of an event; the named field_ids come first and the rest keep their order.

  11. Added

    GET /looks/{id}/fields lists the event fields a theme declares, each with a state of ok, missing, archived or conflict, and POST /looks/{id}/fields/accept creates the missing ones and restores the archived ones.

  12. Added

    A look's files are managed with GET and POST /looks/{id}/files and GET, PATCH and DELETE /looks/{id}/file?path=; send one of body or body_base64, up to 1 MiB decoded, and base on PATCH to refuse a stale edit with 409. Look 0 is the legacy account files.

  13. Added

    Custom account pages are managed with GET and POST /pages and GET, PATCH and DELETE /pages/{id}. body is the page's Figh source and must compile; send base from the last read on PATCH and a stale edit answers 409.

  14. Added

    GET and PATCH /design and /events/{slug}/design read and stage design tokens, each with its draft and published value; POST .../publish is the one moment a change reaches a buyer and POST .../discard drops the draft. reset takes tokens back to the layer below.

  15. Added

    GET and PATCH /events/{slug}/invitation-lists/{id}/prices and /events/{slug}/invitations/{id}/prices read and override ticket prices per list or recipient: a price_cents of null removes an override, 0 is free, and an omitted type keeps its price.

  16. Added

    GET and PATCH .../settings/fields on an invitation list or a single invitation read and override which person fields it asks, per audience; an appearance of default removes the local override.

  17. Added

    GET, PATCH and DELETE /events/{slug}/invitation-lists/{id}/settings and /events/{slug}/invitations/{id}/settings read, override and clear RSVP settings per list or recipient; inherit removes one override and DELETE removes them all.

  18. Added

    GET /events/{slug}/invitation-lists/{id}/send previews who an invitation batch reaches, in ?mode=unsent or remind, and POST sends it to the listed invitation_ids with confirmed: true. Sending is synchronous and has no idempotency key.

  19. Added

    GET and PUT /events/{slug}/page-order read and arrange the event page: an order of section, ticket type and product tokens, with names for the sections, up to max_sections of them.

  20. Added

    /events/{slug}/integrations configures an event's sync targets: list them, PUT a service's settings, PUT .../type-map to map ticket types to the provider's, GET .../options and .../types for its choices, DELETE to remove one. Credentials are never returned.

  21. Added

    A ticket type's companion rule and free-ticket rule are read, set and cleared with GET, PUT and DELETE /events/{slug}/ticket-types/{id}/companion and .../free-with. PUT replaces the rule whole; its target must be another active ticket type on the event.

  22. Added

    GET /events/{slug}/tickets/{ref} reads one ticket, GET .../times lists its timed seats and the times each can move to, POST .../reschedule moves one (seat_id, session_id, optional notify), and POST .../resend sends the assignment email again.

  23. Added

    GET /events/{slug}/reports/{id}/results runs a saved report and answers its columns, rows and totals in one currency; ?currency= reads it in another enabled event currency without changing the saved definition.

  24. Added

    Check-in lists are managed with POST /events/{slug}/checkin-lists, PATCH, DELETE and POST .../{id}/duplicate; GET and POST .../{id}/groups/{ref} read and perform an order's group check-in, oldest tickets first. CheckinListSummary has entitlement_id.

  25. Added

    Saved reports are managed with POST /events/{slug}/reports, GET, PATCH and DELETE /events/{slug}/reports/{id} and POST .../duplicate. A report's source cannot change after creation, and the list leaves out reports whose source the key cannot read.

  26. Added

    EventCreate and EventPatch take venue_lat, venue_lng and venue_place_id, the venue's map pin. Latitude and longitude are decimal strings that go together, and empty strings clear the pin.

  27. Added

    GET and PATCH /events/{slug}/settings/invitations/fields read and set which person fields an invitation asks, per audience (primary or guest), with an appearance of optional, required, readonly, secret or off.

  28. Fixed

    EventPatch lists search_indexing (inherit, on or off) in place of no_index, which was never writable: no_index is the resolved answer on Event and is only read.

  29. Added

    GET /buyers lists the account's buyer register, searched with ?q= and paged with ?after=, and GET /buyers/{ref} answers one buyer with their spend per currency, quotes, orders and bank-transfer instructions. Neither carries a capability token.

  1. Added

    Badge designs have scale_name, which prints the name as large as fits on one line, and show_event and show_ref, which print the event name along the bottom and the ticket reference in the corner; each can be switched off.

  1. Added

    The error code sandbox_read_only is answered inside an account's test-mode copy by the routes that set the account up rather than act inside it. Make those writes against the live account.

  1. Added

    Badge designs have paper (a4, letter or custom with paper_width_mm and paper_height_mm), papers listing what is on offer, and custom_width_mm and custom_height_mm for one badge while sheet is custom. A size outside its bounds is clamped, not refused.

  2. Added

    Messages and invitation sends take preview: the line an inbox shows after the subject, plain words on one line. Message.preview is always present, empty for none.

  3. Added

    Events have passed_params_on and passed_params_pattern (comma-separated globs, utm_* by default; * or a* is refused with 422). Order.passed_parameters is what the buyer's link carried, {} when none, and POST /events/{slug}/orders takes it directly.

  1. Added

    /checkout holds the account's tax_display_excludes, ask_company and sends_einvoices, which /invoicing still serves too. /events/{slug}/settings/checkout gives an event its own tax_display (inherit, inc, exc) and ask_company (inherit, on, off).

  2. Added

    Events have admin_url, a link to the event's admin page.

  1. Added

    RemovedOrderNote.invoices lists the numbers of the invoices issued for a removed order, oldest first; an invoice keeps its number when its order is removed. Empty when none was issued.

  1. Added

    An event's field attachments carry a condition: condition_field_id and condition_value show the question only when that parent's answer matches, and condition_rules lists richer rules, each a parent_id, an operator (equals, contains, any, all) and values.

  2. Added

    Event after-registering settings have holder_details_locked: once a ticket has a name, an email address and every required answer, only the organizer can change its details.

  1. Added

    Events have unlisted. An unlisted event is left off the account's event list and its series page and nothing else changes: its page answers everybody and sells. Set it with EventPatch.unlisted.

  2. Added

    RemovedOrderNote has moved_to and moved_ref: sandbox and the copy's own ref when the order was copied into the account's test-mode copy before removal, null for a plain delete, which is every removal DELETE /orders/{ref} makes.

  1. Added

    Widgets have a purpose of purchase or interest, and interest_message for the words an interest widget shows. GET /events/{slug}/interest lists who asked to hear about the event through one: email, consent, created_at and confirmed_at, with the widget_id.

  1. Added

    A select or multi_select field can end in a write-in answer: other_choice turns it on and other_label names the row, empty for the standard "Other". What the person writes is stored as the answer itself.

  2. Added

    Orders have card: the brand (Stripe's own code, such as visa) and last4 of the card that paid, or null for an order paid another way, free, or paid before this was kept.

  3. Added

    POST /events/{slug}/messages/{id}/send-now skips the rest of the sixty-second hold a send with no at arms. A message not inside its hold, including one scheduled for a named moment, is refused with 409 not_holding.

  1. Added

    The translations list carries each piece of Content as static_page.{id}.title and static_page.{id}.body, read and written like any other ref. The body is the composer's stored form, not prose; read GET /events/{slug}/pages/{id} for the words.

  2. Added

    /contacts and /contact-lists keep the address book: list, add, edit and delete people (q, tag and list narrow GET /contacts), make, rename or archive lists, and put people on one or take them off. 404 contacts_off when the account keeps none.

  3. Added

    GET /invoicing/numbering reads the document numbering series: scope, zero_value and, per entry in kinds, prefix, pad, reset and next. PATCH changes it all at once; changing scope after a number has been issued is 409 scope_locked.

  4. Added

    GET /connections lists every service the account can connect, connected or not; GET /connections/{service} reads one. DELETE /connections/{service} revokes it at the provider first (502 revoke_refused keeps it), and POST /connections/google-sheets/sheet makes the sheet.

  5. Added

    POST /tickets/{ref}/reinstate puts one canceled ticket back without moving money. Only a ticket canceled with its money kept qualifies; anything else is 409 not_reinstatable. A full ticket type is reported as oversold rather than refused.

  6. Added

    POST /workflows makes a workflow from name and an optional template, always switched off; PATCH /workflows/{id} renames it or sets enabled, answering 409 not_ready for a definition that is not finished; DELETE /workflows/{id} removes it.

  7. Added

    POST /orders/{ref}/reinstate puts a canceled order back to paid without moving money; email_buyer tells the buyer. Only an order canceled from paid qualifies, anything else is 409 not_reinstatable. The answer counts its tickets and any oversold.

  8. Added

    POST /webhooks adds an endpoint from url and event_types, PATCH /webhooks/{id} pauses or resumes it with enabled (resuming sends the backlog), DELETE removes it, /test posts a test delivery and /redeliver replays one by delivery_id. The secret is never served.

  9. Added

    /email-sender manages the custom sending address: PUT sets it up from domain, from_local and from_name and hands back the DNS records to publish, POST /email-sender/check asks where verification stands, and DELETE goes back to the platform's address.

  10. Added

    DELETE /orders/{ref} removes a test order outright and releases its places; a paid order is refused with 409 refund_first. A RemovedOrderNote survives, which GET /orders/{ref} answers as 410 removed afterwards.

  11. Changed

    A piece of Content can be written without path: leave it out of StaticPageInput and the piece is a block, shown where it is placed rather than at an address of its own.

  12. Added

    Orders have buyer: the person's own country (ISO 3166-1 alpha-2) and einvoice_id, the tax number their country puts on an invoice to a person. Null unless sends_einvoices is on, and einvoice_id is empty whenever company is set.

  13. Added

    Invoicing.sends_einvoices makes the checkout ask for the country-specific identifier an e-invoice needs, and OrderCompany.einvoice_id carries the buyer's answer, to be read against country. Empty for a country whose invoices route on vat_number.

  14. Added

    Message.files lists the files attached to a message, in order, each a MessageFile with filename, size in bytes and a delivery of email or link. Read only: attaching a file is done in the admin.

  15. Added

    Messages have calendar: send true on MessageInput to attach a calendar file for the event, built from each recipient's own order. Defaults to false.

  16. Added

    OrderCompany.vat_status says what the EU VAT register answered about vat_number: valid, invalid, unavailable, or empty before an answer and for a country outside the register. vat_registered_name is the register's own name for its holder.

  1. Added

    Events have share_title and share_text, what a pasted link shows, empty when the name and the date and venue are used; PATCH /events/{slug} sets them. share_image_url is the uploaded sharing picture, read only.

  2. Added

    Order.company is who an order was bought for when the buyer said they were buying for a company, null otherwise; subdivision is the ISO 3166-2 code where Tito has the country's list. Invoicing.ask_company says whether the checkout asks.

  3. Added

    GET /api-keys lists the account's keys, revoked ones included, GET /api-keys/{id} reads one and POST /api-keys/{id}/revoke shuts it. No answer carries a secret: display names a key. GET /api-requests reads the request log, pruned to 90 days, without its bodies.

  4. Added

    /looks lists, makes, reads, renames and deletes the account's looks, and POST /looks/{id}/select makes one the default. Colours travel as manifest_toml, and "" clears them; every read carries events, the events the look moves when it changes.

  5. Added

    GET /contact-settings reads whether the account derives an address book from its activity and from which sources, and PATCH /contact-settings changes it. Turning it on backfills from the history already there.

  6. Added

    GET /notifications reads the order-notification settings (on, email, period_seconds, locale) and PATCH /notifications changes them. Switching them on starts from then: orders paid while they were off are not reported.

  7. Added

    GET /invoicing reads the account's invoicing settings (the seller's identity and address, where a bank transfer goes, and whether public prices exclude tax) and PATCH /invoicing changes them. Only the keys present change; absent is not blank.

  8. Added

    /details lists, adds, reads, edits, removes and restores the account's event details. Only a detail's default can change after creation; DELETE destroys a detail nothing has filled in and archives one with answers, and says which.

  9. Added

    PATCH /account changes the account's name, search_indexing, home_page and root_pages; only the keys present change. root_pages is refused with no_root_domain where there is no root domain to put pages on.

  10. Added

    POST /events/{slug}/widgets makes a widget, and …/{id} reads, edits and deletes one. The slug derives from the name and never changes; an empty ticket_type_ids means everything on sale, including types made later.

  11. Added

    PATCH /widget-domains/{id} approves or blocks a website the widget was seen on: status is approved, blocked or pending, and the decision covers every widget on every event. There is no create: a website arrives by being seen.

  12. Added

    /events/{slug}/pages lists, writes, reads, edits and deletes an event's Content pages. A page arrives a draft unless published says otherwise, body is prose, and deleting a page something on the event links to is refused.

  13. Added

    /events/{slug}/terminal-readers lists an event's card readers, reads one with its door URL and PIN, renames it, rotates its door credentials and archives it. Registering a reader is not served: it claims a pairing code read off the device.

  14. Added

    GET /events/{slug}/badge-design reads how an event's badges are drawn and PATCH changes it. An event has one design, so there is no list, create or delete; lines replaces the stack whole, and a body that leaves the name line out gets it back at the top.

  15. Added

    /events/{slug}/downloads manages an event's file library, addressed by token. POST uploads one file per request as multipart/form-data with the bytes in file, up to 10 MB; PATCH renames or describes it; DELETE removes it from every portal that offered it.

  16. Added

    /events/{slug}/translations lists the languages an event offers words in, …/{locale} lists every string by ref with its base, working and published text, a PATCH saves the working text ("" clears one) and …/{locale}/publish copies it over what attendees read.

  17. Added

    /events/{slug}/offerings lists, adds, reads, edits, puts on and off sale, removes and restores an event's goods, donations and sessions, said by kind and addressed by {family}/{id}. A removed offering is deleted if never sold, else archived; a restored one is off sale.

  18. Added

    /tax-rates lists, adds, reads, edits, archives, restores and removes the account's tax rates. rate_bps is set once and refused on a PATCH; DELETE deletes a rate nothing points at and archives one in use, and the answer says which.

  19. Added

    An event's details, languages and invitations settings each have a GET and a PATCH. In details, values maps a field id to its answer and null falls back to the account's default, as "inherit" does in invitations; extra replaces the languages offered.

  20. Added

    GET /events/{slug}/public-pages lists every address an event answers on: its own page, audience pages, portals, application pages and widgets. POST …/{kind}/{id}/close and open stop and start one answering; the link keeps working and says so.

  21. Added

    GET /events/{slug}/settings reads an event's settings panels, and registration, payment, after-registering and features each have a GET and a PATCH. A PATCH changes only the keys present; features.sections is replaced whole.

  22. Added

    /events/{slug}/quotes lists and creates quotes, addressed by ref, and send, convert and cancel one. Creating emails the buyer unless send: false; convert makes the pending order and answers 409 repriced until confirm: true when a quoted discount has moved.

  23. Added

    Account.search_indexing says whether the account's site is open to search engines, and Event.search_indexing is the event's own answer: inherit, on or off. Event.no_index is the resolved result of the two and the one to read.

  1. Added

    /events/{slug}/application-pages lists, creates, edits, closes and reopens application pages and lists each page's applications; /events/{slug}/applications/{id} reads one and approve or reject decides it. decide_by and pay_mode are fixed once anybody has applied.

  2. Added

    /events/{slug}/portals lists, creates and edits portals, pooled (allocation plus ticket_type_ids) or per type (ticket_types), and archives, unarchives, revokes, reinstates, regenerates and emails their links. slug, currency and the ticket types are fixed at creation.

  3. Added

    /events/{slug}/audiences lists, creates, edits and deletes an event's audience pages. ticket_type_ids sets which types a page shows; deleting a page that still shows some is 409 in_use, a taken slug is 409 slug_taken.

  4. Added

    /events/{slug}/invitation-lists creates, edits and archives invitation lists, and /events/{slug}/invitations reads, edits, revokes, reinstates and emails the invitations on them, each with its status and bearer url. ?list=<id> narrows the list of invitations.

  5. Added

    /events/{slug}/messages drafts, edits and deletes emails to an event's people, with an audience of all, buyers, both, invited or type:<ticket type id>. send goes after a sixty-second hold or at at; stop takes a message off the clock.

  6. Added

    /events/{slug}/coupons manages discount rules (percent_bps or amount_off_cents) and their promo codes: add one, relabel it, remove it (deleted if unused, else retired), or generate up to 500 at once with POST …/codes/batch.

  7. Added

    /fields manages the account's fields library: list, create, read, edit, remove (deleted if never answered, else archived) and restore. /events/{slug}/fields lists where each is asked on an event, attaches one by target_type and target_id, and detaches it.

  8. Added

    Ticket types can be created, read one at a time, edited, put on and off sale, removed and restored. DELETE deletes a type nobody has bought and archives one that has been used; the answer says which. restore answers 409 not_archived on a live type.

  9. Added

    POST /events creates an event and PATCH /events/{slug} edits its general settings; publish, archive, unarchive and duplicate do what the admin's buttons do. POST /series and PATCH /series/{slug} manage series. A PATCH refuses null and an unknown field.

  1. Changed

    Ticket.answers can carry questions asked because of a session the holder picked, not only the ticket type's, in the same shape. Two holders of one type can carry different questions, and moving a holder drops the answers their new option does not ask for.

  1. Changed

    A row's name in the availability report is never empty: a block of session options the organizer left unnamed is reported by when it runs, such as "Fri 5 Mar, 10:00–11:30", in English like the rest of the report.

  2. Changed

    GET /events/{slug}/ticket-types leaves out archived ticket types. A type that has been sold is archived rather than deleted when the organizer removes it, so a type that disappears from the list may still appear on orders and tickets.