> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.todaytixgroup.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.todaytixgroup.com/_mcp/server.

# Change an item's quantity

PATCH https://stg.ttix.io/api/v3/carts/{cartId}/items/{itemId}
Content-Type: application/json

Holds a different number of units of an extra already on the cart, up or down from the number held now, and returns the cart repriced. The rest of the cart is untouched — the customer keeps the same hold and the same expiry.

* `itemId` is the `id` of the line on the cart response, not an inventory item ID. Two items of the same extra at different price options are separate lines with ids of their own
* `quantity` is the number to end up holding and is at least 1. To drop the item, send `DELETE /carts/{cartId}/items/{itemId}`
* Only an `Extra` item can be changed. A cart's seats and GA are set when it is created; to release them, delete the cart with `DELETE /carts/{cartId}`

Reference: https://docs.todaytixgroup.com/api-reference/purchase/cart/patch-cart-item

## Authentication

- `X-TT-API-Key` header (required) — API Key authentication via header

## Servers

- `https://stg.ttix.io` (Staging Environment, default)
- `https://api.ttix.io` (Production Environment)

## Request

### Path parameters

- `cartId` (string, required) — Cart ID (UUID)
- `itemId` (string, required) — Cart item ID, as it came back on the cart response `items[].id`

### Headers

- `X-TT-Platform` (enum, required) — Identifies the platform the request comes from.
  - Allowed values: `android`, `api`, `ios`, `web`
- `X-TT-Retailer` (string, required) — Your retailer identifier, provided during onboarding. It must be a retailer your API key was issued for.

### Body (application/json)

This endpoint expects a PatchCartItemRequest.

- `quantity` (integer, required) — Number of units of this item to hold, up or down from the number held now. At least 1: to drop the item, send `DELETE /carts/{cartId}/items/{itemId}` instead.

## Response

### 200

Cart repriced for the new quantity.

- `data` (CartResponse, required) — Shopping cart containing held inventory cart items.

## Errors

### 400 Bad Request Error

`INVALID_FIELD_VALUE` for a malformed cart ID, an `itemId` that is blank or longer than 64 characters, an `itemId` naming a seat or GA item rather than an extra, a missing or non-positive `quantity`, or a `quantity` above the item's or the price option's `maxQuantityPerOrder`. `INVALID_REQUEST` when the cart holds a bundle, or an extra already on it can no longer be identified, so the cart cannot be rebuilt.

- `error` (ErrorResponse, required) — What went wrong: `type` and `code` for your code to act on, `message` to display.

### 401 Unauthorized Error

`UNAUTHORIZED` — the API key is missing. `INVALID_API_KEY` — the API key is invalid. `INVALID_ACCESS_TOKEN` — the customer access token is invalid or has expired: refresh it and retry, or send none to continue as a guest.

- `error` (ErrorResponse, required) — What went wrong: `type` and `code` for your code to act on, `message` to display.

### 403 Forbidden Error

Insufficient permissions to access this resource. Any request sent from a web page gets `ORIGIN_NOT_ALLOWED` when the page's origin is not one the API key allows. Add the origin to the key, or use a key that allows it. A request with no `Origin` header, such as one from your server, is never refused for this.

- `error` (ErrorResponse, required) — What went wrong: `type` and `code` for your code to act on, `message` to display.

### 404 Not Found Error

No cart exists for this ID, or the cart holds no item with this `itemId`; `details.resourceType` says which.

- `error` (ErrorResponse, required) — What went wrong: `type` and `code` for your code to act on, `message` to display.

### 409 Conflict Error

`INVENTORY_EXHAUSTED` — the extra can no longer be held in the requested quantity. `CART_ALREADY_ORDERED` — the cart was converted to an order (possibly since canceled); `details.orderId` names it.

- `error` (ErrorResponse, required) — What went wrong: `type` and `code` for your code to act on, `message` to display.

### 410 Gone Error

The cart ran out of time, was deleted, or no longer holds inventory. Create a new cart to continue.

- `error` (ErrorResponse, required) — What went wrong: `type` and `code` for your code to act on, `message` to display.

### 429 Too Many Requests Error

Too many requests. Wait at most the number of seconds in the `Retry-After` header when it is present, then send the request again.

- `error` (ErrorResponse, required) — What went wrong: `type` and `code` for your code to act on, `message` to display.

## Types

### CartResponse

Shopping cart containing held inventory cart items.

- `id` (string, required) — Cart ID. Keep it on your server: with your API key, it can read the order placed from this cart.
- `expiresAt` (datetime, required) — UTC timestamp when the cart hold expires and inventory is released. Clients should display a countdown timer and warn users before expiration.
- `items` (list of CartItemResponse, required) — Items currently in the cart (held inventory). Each item's priceOption carries the itemized fees[] disclosure. Protection and credits are NOT items — see receiptLines.
- `receiptLines` (list of ReceiptLineResponse, required) — Server-ordered display lines for receipt rendering. Iterate in sequence. Always includes SubtotalLine. Conditionally: VoucherLine, ProtectionLine, CreditLine. Fees are never a receipt line — they are disclosed per item on priceOption.fees.
- `total` (Money, required) — Amount the order will charge. Worked out again on every read, so it can change while the cart is open: read the cart just before checkout and send this value as expectedTotal on POST /orders. Leave out the currency query parameter on that read: a re-quote in another currency does not change the cart's currency, so its total fails checkout.
- `protection` (ProtectionResponse, optional, nullable) — Protection covering all items. Null if not added.
- `options` (CartOptionsResponse, optional) — Choices for this cart, such as the currencies it can be priced in, the payment methods it accepts and the extras that can be added.
- `voucher` (VoucherResponse, optional, nullable) — Voucher code applied to the cart. Null if none applied.
- `totalTaxes` (Money, optional) — DISCLOSURE ONLY — taxes already included in total. Omitted when the cart carries no tax.

### ErrorResponse

What went wrong: `type` and `code` for your code to act on, `message` to display.

- `type` (enum, required) — High-level error category.
  - Allowed values: `INVALID_REQUEST_ERROR`, `AUTHENTICATION_ERROR`, `PAYMENT_ERROR`, `PERMISSION_ERROR`, `NOT_FOUND_ERROR`, `CONFLICT_ERROR`, `RESOURCE_GONE_ERROR`, `RATE_LIMIT_ERROR`, `API_ERROR`, `SERVICE_UNAVAILABLE`
- `code` (enum, required) — Machine-readable error code.
  - Allowed values: `INVALID_FIELD_VALUE`, `ACCESS_CARD_NOT_VERIFIED`, `ACCESS_CARD_WRONG_SCHEME`, `ACCESS_VERIFICATION_NOT_SUPPORTED`, `ACCESS_VERIFICATION_UNAVAILABLE`, `TICKET_ALERT_SIGNUP_NOT_SUPPORTED`, `MIXED_ITEM_TYPES_NOT_SUPPORTED`, `INVALID_VOUCHER`, `CURRENCY_NOT_SUPPORTED`, `CURRENCY_TEMPORARILY_UNAVAILABLE`, `MISSING_REQUIRED_HEADER`, `MISSING_REQUIRED_FIELD`, `UNAUTHORIZED`, `INVALID_API_KEY`, `INVALID_ACCESS_TOKEN`, `PAYMENT_AUTHENTICATION_REQUIRED`, `PAYMENT_DECLINED`, `RISK_CHECK_FAILED`, `APPLE_PAY_NOT_AVAILABLE`, `APPLE_PAY_SESSION_UNAVAILABLE`, `INVALID_REQUEST`, `RESOURCE_NOT_FOUND`, `INSUFFICIENT_PERMISSIONS`, `ORIGIN_NOT_ALLOWED`, `RATE_LIMITED`, `INTERNAL_SERVER_ERROR`, `SERVICE_UNAVAILABLE`, `INVENTORY_EXHAUSTED`, `OCCURRENCE_NOT_AVAILABLE`, `OCCURRENCE_NOT_COMPATIBLE`, `ORPHANED_SEATS`, `INVALID_PRICE_OPTION`, `MIXED_OCCURRENCES_NOT_SUPPORTED`, `EVENT_NOT_SELLABLE`, `MIXED_PRODUCT_TYPES_NOT_SUPPORTED`, `MULTIPLE_GIFT_CARDS_NOT_SUPPORTED`, `GIFT_CARD_QUANTITY_NOT_SUPPORTED`, `MINIMUM_QUANTITY_NOT_MET`, `VOUCHER_NOT_APPLICABLE_TO_GIFT_CARD`, `CART_EXPIRED`, `EXPECTED_TOTAL_MISMATCH`, `TICKET_LIMIT_EXCEEDED`, `PAYMENT_METHOD_NOT_AVAILABLE`, `CART_ALREADY_ORDERED`, `CART_ALREADY_CLAIMED`, `INVALID_IDEMPOTENCY_KEY`, `IDEMPOTENCY_KEY_ALREADY_PROCESSING`, `IDEMPOTENCY_KEY_CART_MISMATCH`, `IDEMPOTENCY_KEY_FAILED`, `GRANT_NOT_CLAIMABLE`, `GRANT_NOT_CANCELLABLE`, `ACTION_NOT_AVAILABLE`, `THIRD_PARTY_OUTAGE`
- `message` (string, required) — Human-readable description of the error.
- `param` (string, optional, nullable) — The request field that caused the error, if applicable.
- `details` (map from string to ErrorResponseDetails, optional, nullable) — Additional structured data for client recovery logic.

### CartItemResponse

A reserved unit of inventory in the shopping cart

- `id` (string, required) — Opaque identifier for this cart item, unique within the cart. Echo it back to change or remove the item. It identifies the line, not the inventory, so it survives a quantity change and two items of the same extra at different price options have different ids.
- `event` (EventSimpleResponse, required) — Event the inventory belongs to
- `occurrence` (OccurrenceSimpleResponse, required) — Occurrence the inventory belongs to
- `venue` (VenueResponse, required) — The venue where this occurrence takes place
- `inventoryVariant` (InventoryVariantResponse, required) — What was added to the cart: a seat, general admission area, extra or gift card
- `priceOption` (PriceOptionResponse, required) — The selected price option
- `quantity` (integer, required) — Number of units reserved
- `delivery` (DeliveryResponse, optional, nullable) — How tickets for this item will be delivered. Null when delivery details are unavailable.

### ReceiptLineResponse

Server-ordered display lines for receipt rendering. Iterate in sequence. Always includes SubtotalLine. Conditionally: VoucherLine, ProtectionLine, CreditLine. Fees are never a receipt line — they are disclosed per item on priceOption.fees.

- `label` (string, required) — Server-provided display text.
- `total` (Money, required) — Amount for this line. Never negative; `sign` gives the direction.
- `sign` (enum, required) — Display direction (positive = charge, negative = credit/discount).
  - Allowed values: `positive`, `negative`
- `_type` (enum, required) — Discriminator for the line type.
  - Allowed values: `SubtotalLine`, `VoucherLine`, `ProtectionLine`, `CreditLine`

### Money

Monetary amount in minor units (cents for USD). Never uses floating point to avoid precision errors.

- `amount` (long, required) — Amount in minor units (cents for USD, pence for GBP, etc.)
- `currency` (string, required) — ISO 4217 currency code

### ProtectionResponse

Protection covering all items. Null if not added.

- `id` (string, required) — Unique identifier for this protection.
- `pricePerItem` (Money, required) — Per-ticket protection rate.
- `total` (Money, required) — Total protection cost (pricePerItem × number of tickets).
- `status` (enum, optional, nullable) — Protection redemption status (Order only, omitted in Cart). ELIGIBLE — protection purchased, redemption window open. REDEEMED — user claimed the protection (terminal). EXPIRED — redemption window closed (terminal).
  - Allowed values: `ELIGIBLE`, `REDEEMED`, `EXPIRED`

### CartOptionsResponse

Options that can be applied to this cart. Each key is present only when that option is available.

- `currencies` (list of string, optional) — Currencies this cart can be priced in, as ISO 4217 codes. The first entry is the default currency. Re-request the cart with the `currency` query parameter set to one of these values to quote it in that currency, or switch the cart with PATCH to settle in it.
- `paymentMethods` (list of PaymentMethodOptionResponse, optional) — Payment methods a customer can select for this cart, in priority order. Render them in the order given. `INVOICE` is listed only when the seller settles on account and the caller may pay on account: a secret key on its own, or a secret key with an on-account access token. A customer token on the request brings the customer's permissions, which never include paying on account. Empty when the seller can't take payment for this cart; a cart with a balance to pay then can't be ordered. An order with nothing to pay uses `NONE`, which this list never includes.
- `extras` (list of InventoryItemResponse, optional) — Extras that can be added to this cart, such as merchandise, drinks, or parking. Each entry is an inventory item — add one to the cart through the cart items endpoint using its id and a price option id. Empty when the event offers no extras.

### VoucherResponse

A voucher code applied to a cart.

- `code` (string, required) — The voucher code as entered by the customer.
- `discount` (Money, required) — Amount this code reduces from the cart total, shown as its own receipt line. Zero when the reduction is already taken off the subtotal instead.

### ErrorResponseDetails

Additional structured data for client recovery logic.

### EventSimpleResponse

Lightweight event reference for cart and order items

- `id` (string, required) — Event ID
- `name` (string, required) — Display name of the event

### OccurrenceSimpleResponse

Lightweight occurrence reference for cart and order items

- `id` (string, required) — Occurrence ID
- `startsAt` (datetime, required) — Start date/time in venue local timezone (ISO 8601 with offset)

### VenueResponse

Venue where the occurrence takes place

- `id` (string, optional, nullable) — Stable venue identifier.
- `name` (string, optional, nullable) — Display name of the venue
- `address` (AddressResponse, optional, nullable) — Structured postal address. Null when address data is unavailable.
- `timezone` (string, optional, nullable) — IANA timezone identifier for the venue. Used for datetime display and calendar integration.

### InventoryVariantResponse

A seat, general admission area, extra or gift card. `_type` says which.

- `_type`: `AssignedSeat` (AssignedSeat)
  - `attributes` (list of InventoryAttributeResponse, required) — Attributes describing characteristics of this inventory variant (e.g. legroom, accessibility, VIP perks).
  - `id` (string, required) — Stable identifier for this inventory variant. The same variant has the same id on every occurrence of the event, so a seat can be matched to the seating chart.
  - `name` (string, required) — Human-readable label for this inventory variant. Stable across occurrences and safe for display in UI.
  - `row` (string, required) — Row identifier within the section.
  - `seat` (string, required) — Seat number within the row.
  - `section` (string, required) — Section name within the venue.
  - `description` (string, optional, nullable) — Short plain-text copy about this variant, shown next to the name at seat selection and on the ticket. Omitted when the seller has not written any.
  - `entrance` (string, optional, nullable) — Where the ticket holder enters the venue, such as a door or gate. Omitted when the venue does not assign one.
  - `extendedDescription` (string, optional, nullable) — Longer copy about this variant as rich text, which may contain HTML or Markdown markup. Sanitize before rendering it as HTML. Shown in place of description where the client supports rich text. Omitted when the seller has not written any.
  - `images` (list of ViewFromSeatImage, optional) — Views of the stage from this seat, in the order the venue lists them. Present only on inventory items requested with `include=IMAGES`, and empty for a seat with no images.
- `_type`: `GeneralAdmission` (GeneralAdmission)
  - `attributes` (list of InventoryAttributeResponse, required) — Attributes describing characteristics of this inventory variant (e.g. legroom, accessibility, VIP perks).
  - `id` (string, required) — Stable identifier for this inventory variant. The same variant has the same id on every occurrence of the event, so a seat can be matched to the seating chart.
  - `name` (string, required) — Human-readable label for this inventory variant. Stable across occurrences and safe for display in UI.
  - `description` (string, optional, nullable) — Short plain-text copy about this variant, shown next to the name at seat selection and on the ticket. Omitted when the seller has not written any.
  - `extendedDescription` (string, optional, nullable) — Longer copy about this variant as rich text, which may contain HTML or Markdown markup. Sanitize before rendering it as HTML. Shown in place of description where the client supports rich text. Omitted when the seller has not written any.
  - `venueAreaIds` (list of string, optional, nullable) — Ids of the seating-chart areas this variant sells into, matching the area ids on the venue seating chart so a client can highlight them. Omitted when the variant is not tied to chart areas.
- `_type`: `Extra` (Extra)
  - `attributes` (list of InventoryAttributeResponse, required) — Attributes describing characteristics of this inventory variant (e.g. legroom, accessibility, VIP perks).
  - `id` (string, required) — Stable identifier for this inventory variant. The same variant has the same id on every occurrence of the event, so a seat can be matched to the seating chart.
  - `name` (string, required) — Human-readable label for this inventory variant. Stable across occurrences and safe for display in UI.
  - `caption` (string, optional, nullable) — Short label for this extra, typically a serving size. Omitted when the seller has not written one.
  - `description` (string, optional, nullable) — Short plain-text copy about this variant, shown next to the name at seat selection and on the ticket. Omitted when the seller has not written any.
  - `extendedDescription` (string, optional, nullable) — Longer copy about this variant as rich text, which may contain HTML or Markdown markup. Sanitize before rendering it as HTML. Shown in place of description where the client supports rich text. Omitted when the seller has not written any.
  - `imageUrl` (string, optional, nullable) — Image shown for this extra. Omitted when the seller has not uploaded one.
- `_type`: `GiftCard` (GiftCard)
  - `attributes` (list of InventoryAttributeResponse, required) — Attributes describing characteristics of this inventory variant (e.g. legroom, accessibility, VIP perks).
  - `id` (string, required) — Stable identifier for this inventory variant. The same variant has the same id on every occurrence of the event, so a seat can be matched to the seating chart.
  - `name` (string, required) — Human-readable label for this inventory variant. Stable across occurrences and safe for display in UI.
  - `value` (Money, required) — The balance the card is issued with. Independent of `priceOptions[].sellPrice`, which is what the customer is charged: a card sold at a discount is worth its full value. Always in the currency the card can be spent in, which is the event's own currency and not the one the shopper is browsing in — a card redeems only in the currency it was issued in.
  - `description` (string, optional, nullable) — Short plain-text copy about this variant, shown next to the name at seat selection and on the ticket. Omitted when the seller has not written any.
  - `extendedDescription` (string, optional, nullable) — Longer copy about this variant as rich text, which may contain HTML or Markdown markup. Sanitize before rendering it as HTML. Shown in place of description where the client supports rich text. Omitted when the seller has not written any.

### PriceOptionResponse

A single purchasable price option for an inventory item.

- `category` (PriceCategoryResponse, required) — Pricing category for this option (e.g., Adult, Child).
- `sellPrice` (Money, required) — Per-unit price charged to the customer, including fees and tax.
- `id` (string, optional, nullable) — Unique identifier for this price option.
- `constraints` (PriceOptionConstraintsResponse, optional, nullable) — Selection rules for this option, such as a category it must be bought alongside. Omitted when the option can be bought on its own, and on items whose source reports no selection rules.
- `listPrice` (Money, optional) — Original face value before discounts. Omitted when the option is not discounted or the saving may not be shown, and on the price option of a cart or order item.
- `discountPercentage` (integer, optional, nullable) — Whole-number percentage saved, for a "Save 30%" style label (30 means 30%). Worked out on the server, not from listPrice and sellPrice, which can be priced on a different fee basis. Omitted when the option is not discounted or the saving may not be shown. Never sent together with discountAmount.
- `discountAmount` (Money, optional, nullable) — Amount saved, for a "Save $20" style label. Sent only when the saving may be shown as an amount but not as a percentage, so never together with discountPercentage. Omitted when the option is not discounted or the saving may not be shown.
- `fees` (list of FeeResponse, optional, nullable) — Itemized fee disclosure. Every entry is a component of sellPrice — never add it to a price. Empty when the option carries no fees. Omitted entirely when the retailer or market does not require fee disclosure.
- `maxQuantityPerOrder` (integer, optional, nullable) — Maximum number of units allowed in one order at this price option. The effective limit combines this with the item-level cap and quantityAvailable — use the lowest. Omitted when this price option has no cap.
- `promotion` (PromotionResponse, optional, nullable) — Active promotion for this price option. Omitted when no promotion applies.
- `isDefault` (boolean, optional, nullable) — True for the option a client should pre-select when the item is first shown. Omitted when false.

### DeliveryResponse

How tickets for this item are delivered

- `method` (DeliveryMethodResponse, required) — The delivery method
- `instructions` (string, optional, nullable) — Instructions explaining how the customer will receive or collect their tickets. Null when none are configured.

### PaymentMethodOptionResponse

A payment method a customer can select for this cart.

- `method` (enum, required) — The payment method the customer can choose.
  - Allowed values: `AFTERPAY`, `APPLE_PAY`, `CARD`, `GOOGLE_PAY`, `INVOICE`, `KLARNA`
- `gateway` (enum, optional, nullable) — The payment provider that handles this method. Present for card-based methods; omitted for invoice.
  - Allowed values: `ADYEN`
- `merchantAccount` (string, optional, nullable) — The provider account the client needs to start an Apple Pay or Google Pay flow. It is the account the order is charged through, whatever currency the shopper pays in. Present only on wallet methods.

### InventoryItemResponse

One thing you can buy for an occurrence — a seat, general admission area, extra or gift card — with the price options it is sold at.

- `id` (string, required) — Opaque ID for this inventory item. Pass it whole to the cart; never build or parse it.
- `inventoryVariant` (InventoryVariantResponse, required) — What is being sold: a seat, general admission area, extra or gift card (`AssignedSeat`, `GeneralAdmission`, `Extra` or `GiftCard`).
- `priceOptions` (list of PriceOptionResponse, required) — Available price options. At least one option whenever `quantityAvailable` is above 0. Empty when `quantityAvailable` is 0: the item is listed for display and has no price to buy at.
- `quantityAvailable` (integer, required) — Number of units currently available for purchase. 0 marks a GeneralAdmission area that has sold out but is configured to stay listed: show it as unavailable, and do not add it to a cart.
- `maxQuantityPerOrder` (integer, optional, nullable) — Maximum number of units of this item allowed in one order. The effective limit is the lower of this and quantityAvailable. Omitted when there is no per-order cap.
- `minQuantityPerOrder` (integer, optional, nullable) — Fewest units of this item one order may hold, counted across all its price options. Present only on an Extra that sets a minimum above 1; omitted otherwise.
- `selectionGroup` (SelectionGroupResponse, optional, nullable) — The seats that must be selected together with this one when the customer picks it, computed from the `quantity` sent on the request or fixed by the venue. The group is not guaranteed to hold exactly `quantity` seats: add every listed id. Present on an AssignedSeat the party can pick when `quantity` was sent, and on a seat sold only in a fixed group (such as a box of four) whether or not it was. Omitted on GeneralAdmission and Extra items, on a seat carrying `selectionBlocked`, and on a seat that cannot be picked at the requested `quantity`.
- `selectionBlocked` (SelectionBlockedResponse, optional, nullable) — Present when the request carried a `quantity` and this seat is in stock but not sold to a party of that size. Show the seat as unavailable at this quantity, keep its price on display, and do not add it to a cart; `chainSize` is the quantity that would make it purchasable. Omitted on every seat a party of the requested `quantity` can buy, and whenever no `quantity` was sent.
- `requirements` (RequirementsResponse, optional, nullable) — Present only on a scheduled extra, whose own occurrence still needs picking. Its presence alone is the signal — an item without it needs no such pick.

### AddressResponse

Structured postal address for venue display

- `line1` (string, optional, nullable) — First line of the street address
- `line2` (string, optional, nullable) — Second line of the street address (suite, floor, etc.)
- `city` (string, optional, nullable) — City name
- `state` (string, optional, nullable) — State, province, or region
- `postalCode` (string, optional, nullable) — Postal or ZIP code
- `country` (string, optional, nullable) — ISO 3166-1 alpha-2 country code
- `latitude` (double, optional, nullable) — Latitude coordinate
- `longitude` (double, optional, nullable) — Longitude coordinate

### InventoryAttributeResponse

Attributes describing characteristics of this inventory variant (e.g. legroom, accessibility, VIP perks).

- `name` (string, required) — Short human-readable label for display in badges or tags.
- `category` (enum, required) — Signals how clients should present this attribute: POSITIVE (perk), NEGATIVE (drawback), NEUTRAL (informational), FEATURED (highlight), ACCESSIBILITY (a11y feature).
  - Allowed values: `POSITIVE`, `NEGATIVE`, `NEUTRAL`, `FEATURED`, `ACCESSIBILITY`
- `description` (string, optional, nullable) — Additional context about the attribute, shown in tooltips or detail views.

### ViewFromSeatImage

A view of the stage from a seat.

- `url` (string, required) — Absolute URL of the image.

### PriceCategoryResponse

Category a price option is sold under (e.g. Adult, Child, Senior).

- `name` (string, required) — Display name for the pricing category
- `id` (string, optional, nullable) — Identifier for the category. Consistent for every option in the same response, so constraints.requiresCategory always resolves to a sibling option. Stable across occurrences for inventory managed in TodayTix; for inventory sourced from an external ticketing system, treat it as scoped to the response. Omitted when the item has a single, uncategorized price.
- `description` (string, optional, nullable) — Longer descriptive text shown alongside the name. Omitted when the category has none.

### PriceOptionConstraintsResponse

Selection rules for a price option. Advisory: apply them when the customer builds the order — the server does not guarantee to reject an order that breaks them.

- `requiresCategory` (list of string, required) — Category ids, at least one of which must also be in the order for this option to be purchased (e.g. a Child ticket must be bought with an Adult ticket). Each id matches the category.id of another option on the same item.

### FeeResponse

One itemized fee included in sellPrice. Disclosure only — never an additional charge.

- `type` (enum, required) — The kind of fee disclosed. New fee types may be added over time — treat an unknown value as a new fee type, not an error.
  - Allowed values: `SERVICE_FEE`
- `value` (Money, required) — Per-unit fee amount. Already included in sellPrice — never add it to a price.

### PromotionResponse

A promotion applied to a price option.

- `id` (string, required) — Stable promotion identifier.
- `name` (string, required) — Promotion display name.
- `description` (string, optional, nullable) — Optional plain-text description of the promotion.

### DeliveryMethodResponse

The way tickets are delivered to the customer

- `name` (string, required) — Display name of the delivery method

### SelectionGroupResponse

The inventory items that must be purchased together with this one. Add every id in the list to the cart when the customer selects this item.

- `inventoryItemIds` (list of string, required) — Inventory item ids of every seat in the group, this item included, in seat order. Every member of a group carries the full list, so the group resolves from whichever page of the results the item appeared on.

### SelectionBlockedResponse

This seat is in stock but the event does not sell it to a party of the requested `quantity`, because doing so would leave a seat stranded or break up a run the event sells whole. Show the seat as unavailable at this quantity and do not add it to a cart; offer `chainSize` as the quantity that works.

- `chainSize` (integer, required) — Number of seats in the unbroken run this seat belongs to. Requesting exactly this many always makes the run purchasable, so it is the quantity to offer the customer.

### RequirementsResponse

Conditions the buyer must satisfy before this item can be added to a cart.

- `occurrence` (OccurrenceRequirementResponse, required) — The occurrence this item belongs to must fall within these bounds.

### OccurrenceRequirementResponse

The bounds within which a compatible occurrence for this item may be picked.

- `earliestStart` (datetime, optional, nullable) — Earliest compatible occurrence start time, always in UTC. An occurrence starting at this time is compatible. Omitted when there is no lower bound.
- `latestStart` (datetime, optional, nullable) — End of the compatible occurrence start times, always in UTC. A compatible occurrence starts before this time. Omitted when there is no upper bound.

## Examples

**Request**

```json
{
  "quantity": 2
}
```

**Response**

```json
{
  "data": {
    "id": "6aac14d3-5826-4da8-98b6-9e68c28629d6",
    "expiresAt": "2026-03-15T19:40:00Z",
    "items": [
      {
        "id": "Qm9va2luZ3Mx",
        "event": {
          "id": "123",
          "name": "Hamilton"
        },
        "occurrence": {
          "id": "456",
          "startsAt": "2026-03-15T19:30:00-04:00"
        },
        "venue": {
          "id": "UmljaGFyZCBSb2RnZXJzIFRoZWF0cmU",
          "name": "Richard Rodgers Theatre",
          "address": {
            "line1": "226 W 46th St",
            "line2": "Suite 200",
            "city": "New York",
            "state": "NY",
            "postalCode": "10036",
            "country": "US",
            "latitude": 40.759,
            "longitude": -73.9845
          },
          "timezone": "America/New_York"
        },
        "inventoryVariant": {
          "_type": "AssignedSeat",
          "attributes": [
            {
              "name": "Limited Legroom",
              "category": "NEGATIVE",
              "description": "Seats in this row have reduced legroom due to a safety barrier."
            }
          ],
          "id": "ORCHESTRA-A-101",
          "name": "Orchestra A 101",
          "row": "A",
          "seat": "101",
          "section": "Orchestra",
          "description": "Closest to the stage",
          "entrance": "Door 4",
          "extendedDescription": "Includes a complimentary drink. **Over 18s only.**",
          "images": [
            {
              "url": "https://example.com/seat-views/orchestra-a-101-center.jpg"
            }
          ]
        },
        "priceOption": {
          "category": {
            "name": "Adult",
            "id": "4471",
            "description": "Ages 3-12"
          },
          "sellPrice": {
            "amount": 18500,
            "currency": "USD"
          },
          "id": "eyJwcm92aWRlckNvZGUiOiJGVUxMUFJJQ0UiLCJob2xkQ29kZSI6IjE1NzM5In0",
          "constraints": {
            "requiresCategory": [
              "string"
            ]
          },
          "listPrice": {
            "amount": 18500,
            "currency": "USD"
          },
          "discountPercentage": 30,
          "discountAmount": {
            "amount": 18500,
            "currency": "USD"
          },
          "fees": [
            {
              "type": "SERVICE_FEE",
              "value": {
                "amount": 18500,
                "currency": "USD"
              }
            }
          ],
          "maxQuantityPerOrder": 4,
          "promotion": {
            "id": "promo-opening-week",
            "name": "Opening Week Special",
            "description": "40% off Orchestra seats for opening week performances."
          },
          "isDefault": true
        },
        "quantity": 1,
        "delivery": {
          "method": {
            "name": "E-ticket"
          },
          "instructions": "Your e-tickets will be emailed to you before the performance."
        }
      }
    ],
    "receiptLines": [
      {
        "label": "Subtotal",
        "total": {
          "amount": 18500,
          "currency": "USD"
        },
        "sign": "positive",
        "_type": "SubtotalLine"
      }
    ],
    "total": {
      "amount": 18500,
      "currency": "USD"
    },
    "protection": {
      "id": "prot_001",
      "pricePerItem": {
        "amount": 18500,
        "currency": "USD"
      },
      "total": {
        "amount": 18500,
        "currency": "USD"
      },
      "status": "ELIGIBLE"
    },
    "options": {
      "currencies": [
        "USD",
        "GBP",
        "EUR"
      ],
      "paymentMethods": [
        {
          "method": "CARD",
          "gateway": "ADYEN",
          "merchantAccount": "EncoreTicketsOwnBrand"
        }
      ],
      "extras": [
        {
          "id": "v1_eyJwcm92aWRlcklkIjoxMDAwLCJzZWF0SWQiOiJPUkNIRVNUUkEtQS0xMDEifQ",
          "inventoryVariant": {
            "_type": "AssignedSeat",
            "attributes": [
              {
                "name": "Limited Legroom",
                "category": "NEGATIVE",
                "description": "Seats in this row have reduced legroom due to a safety barrier."
              }
            ],
            "id": "ORCHESTRA-A-101",
            "name": "Orchestra A 101",
            "row": "A",
            "seat": "101",
            "section": "Orchestra",
            "description": "Closest to the stage",
            "entrance": "Door 4",
            "extendedDescription": "Includes a complimentary drink. **Over 18s only.**",
            "images": [
              {
                "url": "https://example.com/seat-views/orchestra-a-101-center.jpg"
              }
            ]
          },
          "priceOptions": [
            {
              "category": {
                "name": "Adult",
                "id": "4471",
                "description": "Ages 3-12"
              },
              "sellPrice": {
                "amount": 18500,
                "currency": "USD"
              },
              "id": "eyJwcm92aWRlckNvZGUiOiJGVUxMUFJJQ0UiLCJob2xkQ29kZSI6IjE1NzM5In0",
              "constraints": {
                "requiresCategory": [
                  "string"
                ]
              },
              "listPrice": {
                "amount": 18500,
                "currency": "USD"
              },
              "discountPercentage": 30,
              "discountAmount": {
                "amount": 18500,
                "currency": "USD"
              },
              "fees": [
                {
                  "type": "SERVICE_FEE",
                  "value": {
                    "amount": 18500,
                    "currency": "USD"
                  }
                }
              ],
              "maxQuantityPerOrder": 4,
              "promotion": {
                "id": "promo-opening-week",
                "name": "Opening Week Special",
                "description": "40% off Orchestra seats for opening week performances."
              },
              "isDefault": true
            }
          ],
          "quantityAvailable": 1,
          "maxQuantityPerOrder": 6,
          "minQuantityPerOrder": 4,
          "selectionGroup": {
            "inventoryItemIds": [
              "v1_eyJwcm92aWRlcklkIjoxMDAwLCJzZWF0SWQiOiJPUkNIRVNUUkEtQS0xMDEifQ",
              "v1_eyJwcm92aWRlcklkIjoxMDAwLCJzZWF0SWQiOiJPUkNIRVNUUkEtQS0xMDIifQ"
            ]
          },
          "selectionBlocked": {
            "chainSize": 3
          },
          "requirements": {
            "occurrence": {
              "earliestStart": "2026-03-01T15:00:00Z",
              "latestStart": "2026-03-02T03:00:00Z"
            }
          }
        }
      ]
    },
    "voucher": {
      "code": "SUMMER20",
      "discount": {
        "amount": 18500,
        "currency": "USD"
      }
    },
    "totalTaxes": {
      "amount": 18500,
      "currency": "USD"
    }
  }
}
```

**SDK Code**

```python
import requests

url = "https://stg.ttix.io/api/v3/carts/6aac14d3-5826-4da8-98b6-9e68c28629d6/items/itemId"

payload = { "quantity": 2 }
headers = {
    "X-TT-Platform": "android",
    "X-TT-Retailer": "YOUR_RETAILER_ID",
    "X-TT-API-Key": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.patch(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://stg.ttix.io/api/v3/carts/6aac14d3-5826-4da8-98b6-9e68c28629d6/items/itemId';
const options = {
  method: 'PATCH',
  headers: {
    'X-TT-Platform': 'android',
    'X-TT-Retailer': 'YOUR_RETAILER_ID',
    'X-TT-API-Key': '<apiKey>',
    'Content-Type': 'application/json'
  },
  body: '{"quantity":2}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://stg.ttix.io/api/v3/carts/6aac14d3-5826-4da8-98b6-9e68c28629d6/items/itemId"

	payload := strings.NewReader("{\n  \"quantity\": 2\n}")

	req, _ := http.NewRequest("PATCH", url, payload)

	req.Header.Add("X-TT-Platform", "android")
	req.Header.Add("X-TT-Retailer", "YOUR_RETAILER_ID")
	req.Header.Add("X-TT-API-Key", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://stg.ttix.io/api/v3/carts/6aac14d3-5826-4da8-98b6-9e68c28629d6/items/itemId")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Patch.new(url)
request["X-TT-Platform"] = 'android'
request["X-TT-Retailer"] = 'YOUR_RETAILER_ID'
request["X-TT-API-Key"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"quantity\": 2\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.patch("https://stg.ttix.io/api/v3/carts/6aac14d3-5826-4da8-98b6-9e68c28629d6/items/itemId")
  .header("X-TT-Platform", "android")
  .header("X-TT-Retailer", "YOUR_RETAILER_ID")
  .header("X-TT-API-Key", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"quantity\": 2\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://stg.ttix.io/api/v3/carts/6aac14d3-5826-4da8-98b6-9e68c28629d6/items/itemId', [
  'body' => '{
  "quantity": 2
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'X-TT-API-Key' => '<apiKey>',
    'X-TT-Platform' => 'android',
    'X-TT-Retailer' => 'YOUR_RETAILER_ID',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://stg.ttix.io/api/v3/carts/6aac14d3-5826-4da8-98b6-9e68c28629d6/items/itemId");
var request = new RestRequest(Method.PATCH);
request.AddHeader("X-TT-Platform", "android");
request.AddHeader("X-TT-Retailer", "YOUR_RETAILER_ID");
request.AddHeader("X-TT-API-Key", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"quantity\": 2\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "X-TT-Platform": "android",
  "X-TT-Retailer": "YOUR_RETAILER_ID",
  "X-TT-API-Key": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = ["quantity": 2] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://stg.ttix.io/api/v3/carts/6aac14d3-5826-4da8-98b6-9e68c28629d6/items/itemId")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PATCH"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```