publ betaReference (MCP guide)
Open publ console

ticket_operations_get

# ticket_operations_get

Prepare ticket availability, parking metadata, seated price overrides or deletion for one exact E00003
schedule. This is a read; it never changes a seat or deletes a schedule.

Supply `channelCode`, `pAppCode:"E00003"`, observed `eventId`, `hallId`,
`scheduleId` and the full intended `operation`. Business IDs are 1–160 ASCII
letters, digits, underscores or hyphens. Requires the selected installed app and
OWNER or MANAGE_P_APPS permission. E00002 is retired.

| operation.kind | Required operation fields |
| --- | --- |
| price | 1–100 distinct `sheetItemIds`, exact `eventPolicyTierPriceId`, `payment:{kind:"free"}` or `payment:{kind:"paid",amount:"1500"}` |
| parkMany | 1–100 distinct `sheetItemIds`, `parking`, confirmation `CHANGE_TICKET_AVAILABILITY` |
| unparkMany | 1–100 distinct `sheetItemIds`, confirmation `CHANGE_TICKET_AVAILABILITY` |
| parkingMetaMany | 1–100 distinct `sheetItemIds`, `parking` |
| park | One `sheetItemId`, `parking`, confirmation `CHANGE_TICKET_AVAILABILITY` |
| unpark | One `sheetItemId`, confirmation `CHANGE_TICKET_AVAILABILITY` |
| parkingMeta | One `sheetItemId`, `parking` |
| deleteSchedule | confirmation `DELETE_SCHEDULE` |

`parking` is `{type,memo}`. Type is LOCATION, EXTERNAL, DEACTIVATED or ETC;
memo is at most 200 UTF-16 units, including empty text. Objects are strict. Do not
supply buyer details, caller currency, URLs, credentials or raw HTTP requests.
For example, this operation fragment blocks two observed available seats:

```json
{"kind":"parkMany","sheetItemIds":["observed-sheet-1","observed-sheet-2"],"parking":{"type":"DEACTIVATED","memo":"Maintenance"},"confirmation":"CHANGE_TICKET_AVAILABILITY"}
```

The tool reads the whole unpaged management sheet, up to 500 items, and checks
identities, exact schedule/event/hall, seat positions and counts. Purchased,
reserved, assigned, discounted or printed selected seats cannot be changed.
Deletion requires every seat unoccupied. A price or isPaid flag alone is not a
purchase. Unrelated occupied seats may remain while eligible seats are changed.

Bulk changes use one dispatch for only unsatisfied selected items. An already
parked seat with different metadata requires parkingMeta, not park. Release keeps
one common existing tier and exact policy prices; price overrides and mixed tiers
are excluded from release. This override restriction is an unresolved service-contract/preservation limit; the original control room does expose release for parked, unpurchased selections. Prepare separate same-tier selections if necessary.

Price overrides use `price` and require a SEATING schedule, eligible unoccupied
tickets and identical stored policy/override maps across selected seats. One
exact policy tier-price is changed while every other override and the original
schedule prices remain intact. Paid amounts follow channel currency rules; zero
requires explicit free. This original control-room action exposes seated items only
and has no explicit override reset/removal entry; tier changes are outside this option.
See the [source action boundaries](#source-action-boundaries). Price preparation returns `pricingObservation` with selected IDs and
their complete observed overrides; a missing/null map means no existing override.

Success returns `TICKET_OPERATION`, `scheduleId`, `scheduleStatus`, `ticketCounts`,
configuration-only `items`, a revision tied to the exact operation, a bounded
`request` preview and `writesPerformed:false`. A null request means the intended
state already matches. No task is created. Purchaser fields are not returned.

Use the unchanged operation and returned revision with
[ticket_operation_apply](ticket_operation_apply.md). Changing any target, selection
or setting requires another preparation. Current reads open the exact schedule
control room; deletion preparation opens its surviving schedule list. Follow the
single returned URL instead of constructing a different host or target path.

A successful read does not prove that a mutation, customer purchase or refund
works. Actual MCP changes and original-console comparison remain separate checks.

## Exact preparation contract

Every call requires an operation; there is no plain discovery/list view or optional operation. Obtain the existing event, hall, schedule and sheet item IDs from an authorized current observation such as the original control room. Never substitute seatId, slotId or a numeric database ID for sheetItemId. Use a separate preparation for every changed target, selection, parking value or operation kind, even when single and bulk forms would have the same effect.

The selected authorized channel needs one exact installed E00003 pApp and its current consumer/base currency. OWNER is allowed; a MANAGE_P_APPS delegate also needs a current manual policy permitting configuration. Content-only delegates and account scope are excluded. Connection, credential version, actor, channel, installation, consumer, currency and permissions are checked again before effects. BOOK_AND_TICKET_V3 uses the selected API origin with no shop store or alternate service fallback.

parking.type and parking.memo are both required for park/parkingMeta variants. Memo is not trimmed and may be empty; null and omitted memo are invalid. The shared input and HTTP boundary enforce 200 UTF-16 code units, not 200 visible characters: an astral character consumes two units, so 100 such characters fit and 101 do not. A metadata edit supplies the complete replacement type and memo. The four type literals are accepted without inventing a different availability workflow for each.

For an active schedule, preparation reads the exact schedule detail and its complete unpaged ticketing management sheet twice. At most 500 items are accepted. It verifies consumer, schedule/event/hall parents, seat-template identity, schedule time consistency, unique sheet/seat identities, seat positions and full count reconciliation. Rows are normalized by sheetItemId. This is not a search or best-effort partial inventory.

| Selection | Required state and result |
| --- | --- |
| park / parkMany | Each selected item must be unoccupied. ONLINE changes to PARKING; an already parked item is satisfied only if both type and memo match. Different parked metadata requires parkingMeta. |
| parkingMeta / parkingMetaMany | Every selected item must be unoccupied and PARKING. Replace type/memo; equal values are satisfied. ONLINE is invalid. |
| unpark / unparkMany | Every selected item must be unoccupied. ONLINE is already satisfied; changed PARKING items must meet the release conditions below. |
| deleteSchedule | Every observed item must be unoccupied and purchasedOnlineTickets must be zero. An already explicitly DELETED schedule is a no-op. |

An occupied selected item rejects the whole preparation, even if its availability would otherwise be satisfied. Occupancy includes purchase/print flags and populated reservation, buyer/assignment or discount fields; it is not inferred from ordinary ticket price or isPaid. Eligible changes may coexist with unrelated occupied rows, which must remain unchanged. The returned configuration items omit raw buyer fields; fingerprints track changes in otherwise omitted source data. Ticket histories are excluded from configuration comparison and are not erased or verified by this workflow.

Release requires the stored seat and metadata tier to agree, that tier to exist in the schedule's tier list, and exactly one matching currency/price for it in every observed event policy. The parked row's policy-price projection must equal those schedule prices. Price overrides are rejected. All changed targets in one bulk release must share one common existing tier. Use separate exact preparations for different tiers; do not add a caller tier or price override. Already-online satisfied rows are not converted again.

## Complete preparation examples

The earlier JSON block is an operation fragment. The following are complete getter arguments for the original seven variants, with illustrative IDs. Replace them with authorized observations; they do not discover targets or authorize changes. Each example prepares its own operation-specific revision.

Prepare a single seat hold:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "hallId": "hall-example",
  "scheduleId": "schedule-example",
  "operation": {
    "kind": "park",
    "sheetItemId": "sheet-example",
    "parking": {
      "type": "DEACTIVATED",
      "memo": "Maintenance"
    },
    "confirmation": "CHANGE_TICKET_AVAILABILITY"
  }
}
```

Prepare a single release at its existing tier and prices:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "hallId": "hall-example",
  "scheduleId": "schedule-example",
  "operation": {
    "kind": "unpark",
    "sheetItemId": "sheet-example",
    "confirmation": "CHANGE_TICKET_AVAILABILITY"
  }
}
```

Prepare a complete parking type/memo replacement, clearing the memo:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "hallId": "hall-example",
  "scheduleId": "schedule-example",
  "operation": {
    "kind": "parkingMeta",
    "sheetItemId": "sheet-example",
    "parking": {
      "type": "LOCATION",
      "memo": ""
    }
  }
}
```

Prepare a hold for two exact items:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "hallId": "hall-example",
  "scheduleId": "schedule-example",
  "operation": {
    "kind": "parkMany",
    "sheetItemIds": [
      "sheet-example",
      "sheet-example-2"
    ],
    "parking": {
      "type": "DEACTIVATED",
      "memo": "Maintenance"
    },
    "confirmation": "CHANGE_TICKET_AVAILABILITY"
  }
}
```

Prepare release for two items sharing one existing tier:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "hallId": "hall-example",
  "scheduleId": "schedule-example",
  "operation": {
    "kind": "unparkMany",
    "sheetItemIds": [
      "sheet-example",
      "sheet-example-2"
    ],
    "confirmation": "CHANGE_TICKET_AVAILABILITY"
  }
}
```

Prepare a shared type/memo replacement on two parked items:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "hallId": "hall-example",
  "scheduleId": "schedule-example",
  "operation": {
    "kind": "parkingMetaMany",
    "sheetItemIds": [
      "sheet-example",
      "sheet-example-2"
    ],
    "parking": {
      "type": "EXTERNAL",
      "memo": "External allocation"
    }
  }
}
```

Prepare deletion of the exact unoccupied schedule:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "hallId": "hall-example",
  "scheduleId": "schedule-example",
  "operation": {
    "kind": "deleteSchedule",
    "confirmation": "DELETE_SCHEDULE"
  }
}
```

## Output and rejected preparation

TICKET_OPERATION returns scheduleId, scheduleStatus, ticketCounts and items containing sheetItemId, seatId, type, parking, isPurchased, isPrinted, occupied, price and seat. It also returns revision, request and writesPerformed:false. The taskType is commerce-ticket-operation and screenId is channel.ticket-operations; these routing fields do not mean a task was created.

The revision binds the entire observed configuration and selected operation. request is the bounded proposed transport form, not an accepted raw-HTTP input. request:null means every selected value is satisfied; a getter never dispatches or creates a journal. Generated timestamps and equivalent monetary/time representations are normalized for stable comparison. Two matching observations do not supply an atomic snapshot or causal proof.

| Code | Meaning |
| --- | --- |
| TICKET_SCHEDULE_UNVERIFIED / TICKET_ITEMS_UNVERIFIED | Identity, parents, schedule data, counts, seat projections or complete-sheet consistency failed. |
| TICKET_ITEM_UNVERIFIED / TICKET_ITEM_NOT_FOUND | An item is inconsistent or the exact selected sheetItemId is absent. |
| TICKET_ITEM_OCCUPIED / TICKET_SCHEDULE_OCCUPIED | A selected item, or some item in a schedule selected for deletion, requires separate lifecycle handling. |
| TICKET_ITEM_STATE | The selected item type does not support the requested operation. |
| TICKET_PRICE_UNVERIFIED | Release cannot prove unchanged same-tier prices, has overrides or mixes changed tiers. |
| COMMERCE_CHANGED | The observations changed during preparation. |

Schema, authorization and context errors may also reject the request. Obtain fresh observations and resolve the cause before preparing a new unsent operation. For uncertain sent work, preserve its original task instead of changing IDs. See the [apply recovery contract](ticket_operation_apply.md#results-and-recovery) and [original-console destinations](ticket_operation_apply.md#console-destination).

These methods do not create/edit schedule metadata or manage discount-policy lifecycle. Price changes the selected seated-ticket override only; it does not change the source schedule policy prices. Schedule listing was not connected at this source boundary. The later [bounded schedule list](ticket_schedules_get.md#bounded-list-observations) provides observed schedule IDs; it does not prepare a control-room operation or discover every creation dependency.

## Seated-ticket price preparation

operation.kind:price selects 1–100 unique sheetItemIds and one observed eventPolicyTierPriceId, with payment free or paid decimal text. It has no confirmation field. Observe that exact policy-price ID in the original control room; the getter requires the intended operation and does not provide schedule discovery. Do not substitute a policy ID, tier label ID, seatId or slotId.

Only SEATING schedules and unoccupied selected tickets are supported. The workflow also guards assigned, printed and other occupied records, beyond that original button predicate. ONLINE items require a matching slot/seat/tier projection; PARKING items must not retain an online slot. Every selected policy must contain exactly one price for the seat tier, with unique policy and price IDs, verified channel currency and a matching schedule policy projection. There may be at most 100 policy/price entries and 100 override entries. Selected tickets must share the same stored policy projections and complete override map; prepare differing groups separately.

A missing/null override map is interpreted as empty. An existing override must identify a known policy-price ID in the same currency. New payment amounts use the [ticket currency/channel rules](ticket_pricing_apply.md#price-rules), including explicit free for zero. This operation does not compute the discount-policy base-price cap. It preserves original schedule policy prices and changes one seat-level override entry, rather than editing a default or discount policy.

pricingObservation returns each selected sheetItemId with its complete observed overriddenPrices map, which can be omitted or null when no map exists. An effective amount already equal to the requested amount is satisfied: the tool does not create a redundant override merely to restate the inherited price. A price preparation revision cannot authorize a different selection, price ID or payment.

The UTF-16 input limit applies to newly supplied parking memos. Preserve old journals instead of rewriting them to bypass validation.

Complete price preparation, assuming KRW and observed eligible same-policy seats:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "hallId": "hall-example",
  "scheduleId": "schedule-example",
  "operation": {
    "kind": "price",
    "sheetItemIds": [
      "sheet-example",
      "sheet-example-2"
    ],
    "eventPolicyTierPriceId": "policy-price-example",
    "payment": {
      "kind": "paid",
      "amount": "1500"
    }
  }
}
```

## Source action boundaries

The current price request and commerce-ticket-operation recovery contract are unchanged by these distinctions. They do not authorize a broader input, replay, hidden backend action or automatic restoration. Actual saved values, original-console comparison and restoration remain unverified.

## Inputs

| Field | Required here | Contract |
| --- | --- | --- |
| `channelCode` | Yes | string; min length 1; max length 512; The exact channelCode selected through channel discovery. Do not supply a URL, channel numeric ID, account ID or credentials. |
| `pAppCode` | Yes | `E00003` |
| `eventId` | Yes | string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
| `hallId` | Yes | string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
| `scheduleId` | Yes | string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
| `operation` | Yes | one of: `price`, `parkMany`, `unparkMany`, `parkingMetaMany`, `park`, `unpark`, `parkingMeta`, `deleteSchedule`, `purchase`, `tier`, `inspect`, `history`, `tickets` (by `kind`) |
| `operation.sheetItemIds` | Yes | When `operation.kind` is `price`: array; items: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
| `operation.eventPolicyTierPriceId` | Yes | When `operation.kind` is `price`: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
| `operation.payment` | Yes | When `operation.kind` is `price`: one of: `free`, `paid` (by `kind`) |
| `operation.payment.amount` | Yes | When `operation.kind` is `price` and `operation.payment.kind` is `paid`: string; pattern `^(0\|[1-9]\d{0,9})(\.\d{1,2})?$` |
| `operation.sheetItemIds` | Yes | When `operation.kind` is `parkMany`: array; items: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
| `operation.parking` | Yes | When `operation.kind` is `parkMany`: object |
| `operation.parking.type` | Yes | When `operation.kind` is `parkMany`: `LOCATION`, `EXTERNAL`, `DEACTIVATED`, `ETC` |
| `operation.parking.memo` | Yes | When `operation.kind` is `parkMany`: string; max length 200 |
| `operation.confirmation` | Yes | When `operation.kind` is `parkMany`: `CHANGE_TICKET_AVAILABILITY` |
| `operation.sheetItemIds` | Yes | When `operation.kind` is `unparkMany`: array; items: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
| `operation.confirmation` | Yes | When `operation.kind` is `unparkMany`: `CHANGE_TICKET_AVAILABILITY` |
| `operation.sheetItemIds` | Yes | When `operation.kind` is `parkingMetaMany`: array; items: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
| `operation.parking` | Yes | When `operation.kind` is `parkingMetaMany`: object |
| `operation.parking.type` | Yes | When `operation.kind` is `parkingMetaMany`: `LOCATION`, `EXTERNAL`, `DEACTIVATED`, `ETC` |
| `operation.parking.memo` | Yes | When `operation.kind` is `parkingMetaMany`: string; max length 200 |
| `operation.sheetItemId` | Yes | When `operation.kind` is `park`: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
| `operation.parking` | Yes | When `operation.kind` is `park`: object |
| `operation.parking.type` | Yes | When `operation.kind` is `park`: `LOCATION`, `EXTERNAL`, `DEACTIVATED`, `ETC` |
| `operation.parking.memo` | Yes | When `operation.kind` is `park`: string; max length 200 |
| `operation.confirmation` | Yes | When `operation.kind` is `park`: `CHANGE_TICKET_AVAILABILITY` |
| `operation.sheetItemId` | Yes | When `operation.kind` is `unpark`: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
| `operation.confirmation` | Yes | When `operation.kind` is `unpark`: `CHANGE_TICKET_AVAILABILITY` |
| `operation.sheetItemId` | Yes | When `operation.kind` is `parkingMeta`: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
| `operation.parking` | Yes | When `operation.kind` is `parkingMeta`: object |
| `operation.parking.type` | Yes | When `operation.kind` is `parkingMeta`: `LOCATION`, `EXTERNAL`, `DEACTIVATED`, `ETC` |
| `operation.parking.memo` | Yes | When `operation.kind` is `parkingMeta`: string; max length 200 |
| `operation.confirmation` | Yes | When `operation.kind` is `deleteSchedule`: `DELETE_SCHEDULE` |
| `operation.sheetItemIds` | Yes | When `operation.kind` is `purchase`: array; items: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
| `operation.orderer` | Yes | When `operation.kind` is `purchase`: object |
| `operation.orderer.name` | Yes | When `operation.kind` is `purchase`: string; min length 1; max length 200 |
| `operation.orderer.phoneCountryCode` | Yes | When `operation.kind` is `purchase`: string |
| `operation.orderer.phoneNumber` | Yes | When `operation.kind` is `purchase`: string; min length 1; max length 12 |
| `operation.orderer.countryCode` | Yes | When `operation.kind` is `purchase`: string |
| `operation.orderer.email` | No | When `operation.kind` is `purchase`: string; pattern `^([a-zA-Z0-9\-\_\.]+)@([a-zA-Z0-9_\-\_\.]+)\.([a-zA-Z]{2,5})$` |
| `operation.reservationId` | Yes | When `operation.kind` is `purchase`: string; min length 1; max length 200 |
| `operation.payment` | Yes | When `operation.kind` is `purchase`: one of: `free`, `paid` (by `kind`) |
| `operation.payment.amount` | Yes | When `operation.kind` is `purchase` and `operation.payment.kind` is `paid`: string; pattern `^(0\|[1-9]\d{0,9})(\.\d{1,2})?$` |
| `operation.parkingInfo` | No | When `operation.kind` is `purchase`: object |
| `operation.parkingInfo.type` | Yes | When `operation.kind` is `purchase`: `LOCATION`, `EXTERNAL`, `DEACTIVATED`, `ETC` |
| `operation.parkingInfo.memo` | Yes | When `operation.kind` is `purchase`: string; max length 200 |
| `operation.confirmation` | Yes | When `operation.kind` is `purchase`: `RECORD_PURCHASE_INFO` |
| `operation.sheetItemIds` | Yes | When `operation.kind` is `tier`: array; items: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
| `operation.tierLabelId` | Yes | When `operation.kind` is `tier`: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
| `operation.sheetItemId` | Yes | When `operation.kind` is `history`: string; min length 1; max length 160; pattern `^[A-Za-z0-9_-]+$`; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
| `operation.page` | No | When `operation.kind` is `history`: integer; minimum 1; maximum 10000; default `1` |
| `operation.limit` | No | When `operation.kind` is `history`: `15` or `30` or `50` or `100`; default `15` |
| `operation.type` | No | When `operation.kind` is `tickets`: `ALL`, `ONLINE`, `PARKING`; default `ALL` |
| `operation.reservationId` | No | When `operation.kind` is `tickets`: string; min length 1; max length 200 |
| `operation.csv` | No | When `operation.kind` is `tickets`: object |
| `operation.csv.language` | No | When `operation.kind` is `tickets`: `ko`, `en`; default `en` |
| `operation.csv.timeZone` | No | When `operation.kind` is `tickets`: string; min length 1; max length 64; default `Asia/Seoul` |