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

  1. Added

    /design/email-css and /events/{slug}/design/email-css read 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.

  2. Added

    A saved report can be shared by link with somebody outside the team. POST .../share makes the link, or a new one with new: true, and DELETE .../share turns it off. Every saved report lists its live link as share.

  3. Changed

    DELETE /connections/{service} answers 409 several_accounts for Stripe while the account holds more than one Stripe account. Disconnect them one at a time with DELETE /connections/stripe/accounts/{acct}.

  4. Added

    An account can hold several Stripe accounts: the Stripe connection lists them as stripe_accounts, events read and set stripe_account, and orders report the stripe_account they were paid into. Make one the default or disconnect one with the two new routes.

  5. Added

    A ticket type can charge a second tax rate beside its first, second_tax_rate_id, each charged on the price. POST and PATCH take it, and an order line or quote line lists each rate it charges, with its own share of tax_cents, as taxes.

  6. Added

    A ticket type has its own sale window, sales_start_at and sales_end_at, read on every ticket type and set with PATCH. It applies only while on_sale is true, and outside it the type is listed with available 0.

  1. Changed

    A promotion code can 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.

  2. Added

    POST /events/{slug}/invitations/{id}/claim and /decline answer an invitation for somebody who replied another way. A claim issues the tickets free, past capacity and the deadline. Both take a reason, and an invitation that can’t take the answer is 409 not_answerable.

  3. Added

    Invitations have answered_for: who claimed or declined one for the invitee, when, and their reason, while that answer stands. It is null when the invitee answered themselves.

  4. Added

    A coupon carries min_per_ticket_type and max_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. POST and PATCH take both, 0 for no limit, on a coupon applied to each ticket.

  5. Added

    A tax rate has rate_milli_pct, its percentage in thousandths of a percent, so 9.975% is 9975. POST /tax-rates takes it in place of rate_bps. rate_bps is still served, rounded half up where a rate has a third decimal.

  6. Added

    Coupons have applies_on_volume_prices, true by default. With false, a ticket the order has taken enough of for one of its volume prices is charged that price with nothing off.

  7. Added

    GET /api-requests takes after, the id of the last call on the previous page, q to match METHOD /path, and status: succeeded, failed or a three-digit code. A bad after answers 422 invalid_after.

  8. Added

    Events have secret_redirect_url: an https address the event page sends visitors to while the event is secret. Set it with PATCH /events/{slug}.

  9. Changed Breaking

    POST /events/{slug}/quotes/{ref}/convert with confirm: true needs confirm_total_cents, the now_cents of the 409 repriced answer, on every confirm. Without it nothing is confirmed. Send both.

  10. 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.

  1. Added

    Portal placements take position before_issue, just above the Issue tickets heading on a portal's tickets page. Any other page answers 422 portal_before_issue.

  2. Changed Breaking

    POST /events/{slug}/invitation-lists/{id}/send queues each email and reports it as queued instead of sent, and skips one still waiting with reason queued. Sending one invitation then answers 409 queued.

  3. 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's show_express_checkout says.

  4. Added

    GET /orders/{ref} has late_vat: VAT a company paid on a reverse-charge ticket before its VAT number was confirmed, with its status, amount_cents and at. Null on every other order.

  5. 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.

  6. Added

    Ticket types have reverse_charge ("", country or eu), reverse_charge_country and reverse_charge_note, for companies whose VAT number the EU register confirms to pay no VAT.

  7. Added

    Webhooks can subscribe to order.updated, ticket.moved, ticket.unvoided, checkin.deleted, interest.created and interest.deleted, and PATCH /webhooks/{id} takes event_types to replace an endpoint's list.

  8. 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.

  9. Added

    POST /email-senders takes smtp to send through the account's own mail server, and senders have mode. Each address carries its server as smtp, changed with POST …/smtp and checked with POST …/smtp/check.

  10. Changed

    PATCH /events/{slug}/portals/{id} accepts slug: new words move the share address to a fresh random tail and the old one stops working. POST /events/{slug}/portals/{id}/regenerate also gives slug a fresh tail.

  1. Added

    POST /buyers/{ref}/block stops a buyer's people placing new orders or generating quotes, with an optional message, and DELETE /buyers/{ref}/block lifts it. Buyers carry the result as block.

  1. Added

    Order discounts have on_addition, true for a code typed when tickets were added to the order after it was placed.

  2. Added

    Companion rules have ticket_type_ids, several companion types any of which count, and per_quantity may be 0 for once per order. PUT takes ticket_type_ids or ticket_type_id, and per_quantity must be sent.

  3. Added

    Portals have share_ticket_type_ids, the free ticket types the shareable registration link offers. A PATCH sends the whole set and answers 422 invalid_body for a priced type or a link left with nothing to offer.

  4. 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.

  5. Changed Breaking

    The font bricolage-grotesque is replaced by host-grotesk in BadgeDesign.font. A badge saved in it reads back as host-grotesk, and a write that sends the old key is stored as host-grotesk.

  6. 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}/orders no longer answers 409 sold_out for it, nor approving an application 409 good_unavailable.

  7. 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.

  1. Added

    Document numbering takes a suffix per kind, printed after the count, on the account's numbering and an event's own. A blank suffix is no suffix, and an annual reset can take its year from it.

  1. Added

    GET /events/{slug}/reports/moved lists who moved between this event and another, and GET /events/{slug}/income has moved_out_cents, moved_out and moved_in for the money that stays where it was paid.

  2. Added

    POST /events/{slug}/tickets/move moves tickets to another event, keeping their refs. A moved ticket has moved_from, and an order line for a type at another event has event and place_released.

  3. Added

    Coupons have shows_only_its_tickets: a buyer who applies one of its codes sees only the ticket types in ticket_type_ids. It needs ticket_type_ids.

  1. Added

    Ticket types have pay_what_you_want and suggested_price_cents. With it on, price_cents is the least a buyer can pay, and setting it on a ticket type priced by tiers, volume or a bundle answers 409 pricing_mode.

  2. Changed Breaking

    order.created for 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. No order.cancelled follows an order like that.

  3. 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 have completed_at, when that happened.

  4. Added

    Each sign-up from GET /events/{slug}/interest has name, empty unless the sign-up moved from Tito Classic with one.

  5. 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's Checkout has collect_unfinished_new_events, the starting value for new events.

  6. Added

    Coupons have shows_ticket_type_ids, ticket types kept off the event page that a buyer sees once they apply a code, and shows_after_used_up (hide or keep). A coupon may take 0 off when it only shows tickets.

  1. Added

    Content pages have portal_placements, set with POST, PATCH and DELETE /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 with page own.

  2. 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.

  3. Added

    GET /events/{slug}/settings/numbering and PATCH /events/{slug}/settings/numbering read and set an event's own document numbering: per-kind prefixes counting from 1 instead of the account's series.

  4. Added

    TicketType.description accepts a composer body with bold, italic, links and bullets, and ticket types carry description_text and description_html, the description as plain lines and as HTML.

  1. Changed

    A ticket tier's sold counts tickets issued, including those on unpaid orders whose tickets already exist and those added to an order afterwards.

  2. Added

    An event's registration settings have capacity: the most tickets the whole event can sell across every ticket type, null for no limit.

  3. Changed

    GET /events/{slug}/report, GET /events/{slug}/income and GET /events/{slug}/reports/coupons also ask financials.view. A key that held events.view before the split was given it.

  4. Changed

    Ticket types, offerings, audiences and questions ask catalog.view and catalog.manage instead of events.view and events.manage. A key holding an events capability before the split was given its catalog twin.

  5. Added

    POST /workflows and PATCH /workflows/{id} take events, the slugs of the events a workflow covers, or all_events: true for every event. Sending both is refused.

  6. Added

    An event's after-registering settings have invoice_details_days and invoice_details_until: the window in which buyers may update their own invoice details from their order page.

  7. Added

    POST /orders/{ref}/invoice-details changes who an order's invoice is made out to; an issued invoice is canceled with a credit note and reissued under a new number.

  8. Added

    Portals have shareable, which switches the shareable registration link on or off. share_url is null, and the portal is not in GET /events/{slug}/public-pages, while it is off or the link can give no ticket for nothing.

  1. 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.

  2. Added

    Events have anonymize_on: when the attendee data the owner asked to anonymize goes. POST /events/{slug}/keep-data takes that back, and answers 409 anonymizing_started once it has begun.

  3. 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 with POST /buyers/{ref}/people/{email}/sees.

  4. Added

    GET /unsubscribes lists everyone who asked to stop getting the account's messages, from one event or from every message the account sends.

  5. Added

    ask_company takes organizations, for an event that sells to organizations only, and company_fields sets each organization detail to hidden, optional or required.

  6. Added

    Messages count delivered, waiting, bounced, not_sent and marked_as_spam, outbox emails have delivery, delivery_reason and fixed_to, and GET /events/{slug}/outbox takes ?status=delivered|didnt_arrive|waiting.

  1. Added

    Email senders have not_sending and not_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.

  2. Added

    GET /data-protection-log lists 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.

  3. Added

    POST .../anonymize on a ticket, order, invitation, customer, waitlist entry or ticket request removes the person and answers an AnonymizeResult. Each record has anonymized_at.

  4. 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.

  5. Changed Breaking

    The homage theme is classic: look_theme reads classic for a design that started from it, and POST /design/theme takes either word. Compare against classic.

  6. 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.

  7. Added

    Designs have the layout_cards token (one, below or each) and the page_width token (fit or wide), and layout_date takes lines.

  8. Changed Breaking

    Resending an order confirmation or a ticket email to the same address within two minutes of the last send answers 409 recently_sent and sends nothing. Wait two minutes before sending it again.

  9. Added

    Events have calendar_on_event_page: whether the event page offers Add to calendar beside its date, before anybody books. Set it with PATCH /events/{slug}.

  1. Added

    POST /events/{slug}/tickets/{ref}/reschedule answers booker_mail_status and booker_email, for the note notify sends a booker who is not the attendee.

  2. Added

    DELETE /events/{slug} deletes an event nothing records, and answers 409 event_has_records otherwise. Event.delete_on says when an event the owner asked to delete goes, and POST /events/{slug}/keep takes that back.

  3. Added

    A message's audience can be signups: everyone who confirmed a sign-up on one of the event's widgets that collect emails, never anyone who withdrew.

  4. Changed Breaking

    POST /events refuses timezone Local with 422 invalid_timezone, and a date at a time the clocks skip in the event's timezone with invalid_dates. Send an IANA zone such as Europe/Dublin.

  5. Added

    Events have archived and archived_at, and GET /events takes ?archived=true or ?archived=false to list only archived or only unarchived events. Any other value answers 422 invalid_query.

  6. Added

    MessageFile.delivery can be offline: Tito took the file offline, so it is sent neither attached nor as a link, and adds no weight.

  7. Added

    Details have in_calendar: whether the detail's value goes into every calendar entry written for an event. Set it on POST /details or PATCH /details/{id}.

  1. Added

    POST /design/from-site and POST /events/{slug}/design/from-site take layout, default true, which writes the layout the website's shape suits. Send false to leave the layout as it is.

  2. Added

    POST /events/{slug}/downloads answers 507 storage_full when the account has used all of its file storage. Remove files, or ask Tito support for more.

  1. 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.

  2. Added

    Audiences have organizations_only, so every booking is made out to an organization, ask_vat (on by default) for the VAT number box, and countries, the ISO 3166-1 alpha-2 codes buyers can be in, empty for any.

  3. Added

    Ticket types read back what PATCH takes: description, tax_rate_id, price_includes_tax, color, max_per_order, allow_downgrade, holder_changes_mode, holder_changes_until, anonymous and qr_enabled.

  4. Added

    Goods and donations read back description, tax_rate_id, price_includes_tax, allow_post_order, assign_to_ticket, sales_start_at and sales_end_at. PATCH takes the sale window as RFC 3339 or null too.

  5. Changed Breaking

    A message segment with a key the compose page has no filter for, or a value of the wrong type, is 422 invalid_body naming it, where it used to be stored as no narrowing. Send type as a number.

  6. Added

    Events have ends_at, all_day and date_text, as PATCH /events/{slug} takes them. That PATCH also takes starts_at and ends_at in RFC 3339 with an offset, the form the read answers.

  7. Added

    A bool design token takes "true" and "false" as well as "1" and "0", and stores them as "1" and "0".

  8. Changed Breaking

    POST /events/{slug}/quotes refuses an extra sold only with a ticket when none of its tickets is on the quote, with 422 needs_ticket, instead of failing at convert. Add one of its tickets to the quote.

  9. Changed

    POST /events/{slug}/quotes prices a line at the ticket type's volume band its quantity reaches, after group discounts and before tax. A unit_price_cents you send still wins over the band.

  10. Added

    Order lines have charged_quantity: how many of quantity were paid for, fewer when a group discount or a free-with rule gave some away. total_cents is unit_price_cents times it, plus any tax added on top.

  11. Added

    Badge boxes take size_pt, a size of the box's own in points from 9 to 200, overriding same_size; the text prints smaller only where a long value needs it. 0 or absent sets it as large as it fits.

  12. Added

    Connections have livemode: on a connected Stripe row, true for a live Stripe account and false for a Stripe sandbox. Null on every other row.

  1. 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.

  2. 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, is 422.

  3. Added

    An event's sales settings have min_tickets_per_order and max_tickets_per_order, 0 to 500, with 0 for no limit. Only tickets count, and a bundle counts as the tickets inside it.

  4. Added

    GET and PATCH /events/{slug}/settings/automated-emails read and replace switched_off, the automated emails an event doesn't send. switchable lists those that can be switched off; naming any other is 422.

  5. Added

    An event's design takes banner_alt, the banner picture's alt text: up to 250 characters on one line, blank for a decorative picture.

  6. 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.

  7. Added

    POST /events/{slug}/checkin-lists takes ticket_type_ids to check in only those ticket types, set when the list is created. Lists have ticket_types_limited and ticket_type_ids, and a ticket of another type is 422 not_eligible.

  8. Added

    POST /events/{slug}/invitations/{id}/approve opens an invitation waiting on approval and emails it, answering the invitation and its delivery. POST …/reject turns it down. Either is 409 not_decidable when the invitation isn't waiting.

  9. Added

    POST /events/{slug}/invitations/{id}/cancel-tickets cancels every ticket a claimed invitation issued. On a paid invitation refund is required: true sends the money back, false keeps it. email sends the invitee the cancellation email.

  10. Added

    Tickets have confirmed_at: when the attendee said they are still coming from a message, null until they do. A message's segment takes confirmed, yes or no, to reach them or whoever hasn't answered.

  11. Added

    A message's segment takes picked, a comma-separated list of up to 2000 ticket references: only those tickets, or whoever booked them, get the message.

  12. Changed Breaking

    PATCH /events/{slug}/badge-design answers 409 unsaved_badge_changes while someone has unsaved changes in Badge settings, and changes nothing. Retry once those changes are saved or discarded.

  13. Added

    POST /tickets/{ref}/cancel cancels one ticket without a refund and puts its place back on sale. A ticket it can't cancel is 409 not_cancelable with the reason.

  14. Added

    POST /design/from-site and POST /events/{slug}/design/from-site start a design draft from a website's url: its colors, closest font, logo, and header and footer links. A site that can't be used is 422 with a site_err_* code, and over 6 reads in 10 minutes 429.

  15. Added

    The design takes order_page_order, the order page's main column in order (items, details, tickets, qr and change, as a comma list), and ticket_page_order, what follows the ticket on its page (schedule and details, in either order).

  16. Added

    Invitations have cc: up to 10 addresses copied in on every email the invitee gets, on a visible Cc line. Each email_history record carries the cc that email went to.

  17. 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.

  18. Changed Breaking

    The confetti theme is sprinkles: look_theme reads sprinkles on a design that started from it, and the theme endpoints take sprinkles. Compare and send sprinkles instead.

  1. Added

    Badge boxes have same_size: set, the box prints at one size on every badge, the largest the event's longest value fits.

  2. Added

    Badge boxes take first_name and last_name keys, the name in two parts, and match_name_parts sets whether the two print at one size (true by default). A badge needs a name on, whole or split: with either part on, name may be off.

  3. Added

    The design takes layout tokens, drafted and published like any other: layout_header, layout_date, layout_tickets, layout_total, layout_spacing and layout_ticket, plus card_price_ink. Starting from a theme writes its layout tokens too.

  4. 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 with PATCH /events/{slug}/settings/checkout.

  5. Added

    The theme endpoints take a twelfth theme, homage, and a badge design's font takes source-sans-3.

  6. Added

    POST /design/theme and POST /events/{slug}/design/theme start a design draft from a theme: send theme, one of the look_theme token's options. The theme's colors, fonts, buttons and decoration go into the draft, and nothing is published.

  1. Added

    /design/document-css and /events/{slug}/design/document-css read and set a stylesheet for invoices, receipts, refund receipts and printed tickets. The pages' stylesheet never reaches them.

  2. Added

    The date_format design token takes custom, which draws the date_pattern token: up to 64 characters in which d, m and y stand for the day, month and year. A pattern with none of them is refused.

  3. Added

    BadgeDesign.font takes manrope, source-serif-4, instrument-serif, ibm-plex-mono, big-shoulders-display and nunito.

  4. Added

    After-registering settings have receipt_delivery: attach, link or none, how the order confirmation hands over a paid order's receipt.

  5. Added

    Event design tokens include print_extras: what the printed ticket prints after the ticket type and name, as a comma list of field:<id>, session:<id> and good:<id>. An id the event can't print is refused with a 422 naming it.

  6. Added

    POST /events/{slug}/tickets/{ref}/resend and POST /orders/{ref}/confirmation answer mail_status: "queued" when the event attaches tickets as a PDF. The email goes out within five minutes.

  7. Changed Breaking

    A manifest_toml naming a setting a theme file does not have is refused with 422 invalid_body naming it, where it used to be dropped silently. The accent font is gone: take type.accent out of a theme file, though an empty accent = "" still imports.

  8. Added

    GET /orders/{ref} includes extra_payments: payments an order took and could not use, such as a second payment for an order already paid. DELETE /orders/{ref} answers 409 refund_first while one is unrefunded.

  1. Added

    Audiences have show_bank_transfer: whether their buyers are offered bank transfer when the event offers it. On by default.

  2. Changed Breaking

    Content pages have has_unpublished_changes. While it is true, PATCH /events/{slug}/pages/{id}, and a translation naming the page, answer 409 unpublished_changes and write nothing: publish or discard the changes in the admin first.

  3. Added

    POST /orders/{ref}/confirmation can answer mail_status: "queued" when the email carries a receipt or invoice PDF. It goes out within five minutes.

  4. Fixed

    POST /events/{slug}/duplicate with a blank slug picks one for a name over 60 characters or with no Latin spelling, rather than refusing it.

  5. 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.

  1. Added

    Coupons have combinable, true by default. With false, a code of the coupon can only be the one code on an order.

  2. Added

    GET /events/{slug}/outbox lists the emails sent to an event's people, filtered by message_id, status or q. Messages have kind, bulk or individual, and GET /events/{slug}/messages takes ?kind=.

  3. Added

    Quotes have promo_codes: every code the quote was priced with, in order, each with its discount_cents. promo_code stays the first.

  4. Added

    GET /events/{slug}/invitations/{id} includes email_history, the emails sent for the invitation. List responses leave it out.

  5. Added

    POST /events/{slug}/design/lift copies an event's published look into the account's design draft. Tokens that belong to the event alone stay behind, and nothing is published.

  6. Changed Breaking

    An invitation's status is draft or sent where it used to be pending. sent means the send succeeded, not that the email reached an inbox. Match on both in place of pending.

  1. Added

    Buyers have domains, email domains whose addresses belong to them before anyone signs in. Add one with POST /buyers/{ref}/domains. An order confirmed for a customer at checkout carries customer_confirmed.

  2. Added

    Event wording takes terms, a set of payment terms' id, to read and change those terms' own invoice email wording: ?terms= on GET, terms in a PATCH, and per_terms on each row. audience and terms together are refused with invalid_scope.

  3. Changed

    Every admin_url is an absolute URL, on a standalone account too, where it used to be a relative path.

  4. Added

    Event wording takes audience, an audience's slug, to read and change that audience's own wording on top of everyone's: ?audience= on GET, audience in a PATCH. Rows say which lines can be worded per audience with per_audience.

  1. Added

    Buyers have billing: who an invoice is made out to, its postal address, vat_number and references. Set it with POST /buyers or PATCH /buyers/{ref}, field by field, where "" clears one.

  2. Fixed

    A download's url points at the root domain, where admin is, rather than at the account's own address, which only redirected.

  3. Added

    Design tokens include time_format: 24h or 12h, the clock buyers read times on.

  4. Added

    POST /buyers/{ref}/people takes contact, a contact's ref, in place of email. An unknown ref answers 422 unknown_contact.

  5. Added

    Buyers have bank_details, the account Stripe issues them to pay bank transfers into. POST /buyers/{ref}/bank-details fetches them from Stripe and keeps them.

  6. Added

    POST /events/{slug}/portals with neither allocation nor ticket_types makes a portal with no tickets, whose allocation is 0. A PATCH sending it an allocation is refused with no_tickets.

  7. Added

    DELETE /events/{slug}/portals/{id} deletes a portal nobody has used, with its set-up. A used one answers 409 portal_in_use.

  8. Added

    Quotes can need approval: POST /buyers/{ref}/po-required turns it on, a Quote gains submitted and rejected statuses with needs_approval, approval and buyer, and po_number on convert records the approving purchase order.

  9. Added

    Buyers have a phone, stored as typed. Set it with POST /buyers or PATCH /buyers/{ref}, where an empty phone clears it.

  1. Added

    POST /buyers adds a buyer, and POST /buyers/{ref}/stripe-customer links one to a customer that already exists in the account's Stripe.

  2. Added

    POST /buyers/{ref}/primary makes one of a buyer's people its primary contact. The previous one stays on as one of its people.

  3. Added

    Buyers have a kind, a label from the account's own list. Manage the list with /buyer-kinds and set a buyer's with POST /buyers/{ref}/kind.

  4. Fixed

    A message's segment.since date begins at midnight in the event's timezone, as the orders list's does, rather than on the server's clock.

  5. Added

    Invitation question fields list ticket_types, the ticket types that ask each question, and an appearance of default asks it the way the ticket does. optional is refused for a question a ticket type requires.

  6. Changed Breaking

    A Content page's published says 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. title is optional, and title_required is gone.

  7. Changed Breaking

    POST /orders/{ref}/cancel answers 409 cancel_failed when a payment is unsettled or in conflict, such as a capture in flight, and 502 cancel_failed for any other failure. Read the error code, not the status alone.

  8. Added

    Invoicing.vendor_signature says whether vendor forms carry the account's signature, and vendor takes seller_signatory, the name printed under it.

  9. Added

    Portals have package_tax_rate_id and package_price_includes_tax: the VAT rate a package fee is charged at, and whether package_cents includes it. Both are refused with package_billed while a bill stands.

  10. Added

    A portal's capabilities can list change_type, buy_more, team and names_only, set in the admin and read here. Unlocking a portal whose team capability is on (access_locked: false) is refused with team_locked.