publ betaReference (MCP guide)
Open publ console

ticket_pricing_get — read and prepare event tier pricing

# ticket_pricing_get — read and prepare event tier pricing

Read one existing E00003 event's active default pricing policy, or prepare an exact price change, tier link or tier unlink for [ticket_pricing_apply](ticket_pricing_apply.md). This is an existing registered method. The shared connection at the implementation revision above supports `tierPrice`, `tierLink` and `tierUnlink`. The [metadata operation](#policy-metadata-candidate) connects policy names and management-label membership.

See [Ticket pricing](../guides/ticket-pricing.md) for authorization, the full sequence and recovery. This getter makes no business write and creates no task.

## 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. |
| `policyId` | No | 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` | No | one of: `tierPrice`, `tierLink`, `tierUnlink`, `metadata` (by `kind`) |
| `operation.eventPolicyTierPriceId` | Yes | When `operation.kind` is `tierPrice`: 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 `tierPrice`: one of: `free`, `paid` (by `kind`) |
| `operation.payment.amount` | Yes | When `operation.kind` is `tierPrice` and `operation.payment.kind` is `paid`: string; pattern `^(0\|[1-9]\d{0,9})(\.\d{1,2})?$` |
| `operation.tierLabelId` | Yes | When `operation.kind` is `tierLink`: 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 `tierLink`: one of: `free`, `paid` (by `kind`) |
| `operation.payment.amount` | Yes | When `operation.kind` is `tierLink` and `operation.payment.kind` is `paid`: string; pattern `^(0\|[1-9]\d{0,9})(\.\d{1,2})?$` |
| `operation.eventPolicyTierPriceIds` | Yes | When `operation.kind` is `tierUnlink`: 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 `tierUnlink`: `UNLINK_TIER_PRICES` |
| `operation.settings` | Yes | When `operation.kind` is `metadata`: object |
| `operation.settings.title` | No | When `operation.kind` is `metadata`: string; min length 3; max length 50; pattern `^[^\r\n]*$` |
| `operation.settings.presentationalTitle` | No | When `operation.kind` is `metadata`: string; min length 3; max length 50; pattern `^[^\r\n]*$` |
| `operation.settings.labelIds` | No | When `operation.kind` is `metadata`: 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.; max items 10 |

Business IDs are 1–160 ASCII letters, digits, underscores or hyphens. They are not numeric database IDs, names or URLs. The input and operation objects are strict: no extra pagination, currency, consumer, installation, credential, header or service-origin fields. Null is not omission.

| `operation.kind` | Other fields | Preparation |
| --- | --- | --- |
| `tierPrice` | `eventPolicyTierPriceId`, `payment` | Select one existing LISTED price with `deletedAt:null`. Preserve its tier assignment. |
| `tierLink` | `tierLabelId`, `payment` | Select one existing LISTED global tier label with no price row in this policy, including no deleted row. |
| `tierUnlink` | `eventPolicyTierPriceIds`, `confirmation:"UNLINK_TIER_PRICES"` | Select 1–100 distinct active price business IDs. Selecting all existing active prices is permitted. |

`payment` is either `{"kind":"free"}` or `{"kind":"paid","amount":"20000"}`. Paid amounts are positive decimal strings, subject to [currency and channel limits](ticket_pricing_apply.md#price-rules). Currency comes from the selected channel. Free must be explicit; paid zero is rejected.

## Read, then prepare the exact operation

Read the policy when the existing event ID is already known:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example"
}
```

The event ID must come from an authorized observed source, such as the original console. This method does not list events. There is no connected event-list or global-tier-label discovery method in this shared ticket slice; do not invent calls from domain-module names.

Prepare an existing price change:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "policyId": "policy-example",
  "operation": {
    "kind": "tierPrice",
    "eventPolicyTierPriceId": "price-example",
    "payment": {"kind": "paid", "amount": "20000"}
  }
}
```

Prepare a new price link to an already observed global label:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "policyId": "policy-example",
  "operation": {
    "kind": "tierLink",
    "tierLabelId": "tier-label-example",
    "payment": {"kind": "free"}
  }
}
```

Prepare removal of one existing price link:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "policyId": "policy-example",
  "operation": {
    "kind": "tierUnlink",
    "eventPolicyTierPriceIds": ["price-example"],
    "confirmation": "UNLINK_TIER_PRICES"
  }
}
```

These are illustrative inputs, not observed targets or execution permission. Replace every target with current authorized observations. The paid example assumes a KRW channel. Copy `policy.eventPolicyId` and the revision from the successful preparation into apply. A revision from a read without an operation cannot authorize a write. Changing the operation, selected IDs or payment requires preparing again.

## Read coverage and inventory

Each observation reads the selected event and exactly one LISTED default policy using `isDefault:true`, page 1 and limit 1. The response must identify an active event and a unique active default policy with total 1. It does not enumerate every event policy. A supplied event-policy projection must agree with the selected policy; absent projections are not verified.

The policy contains at most 500 price rows. Numeric IDs, business price IDs and tier-label IDs must each be unique; consumer and currency must match the current context. Returned prices are sorted by `eventPolicyTierPriceId`, not the original console's display order. Optional embedded event policies are also bounded at 500.

Only `tierLink` and `tierUnlink` additionally read the complete LISTED and ARCHIVED global tier-label inventories. Internal pagination uses page 1–5 and limit 100, verifies page sizes, statuses, stable totals and unique identities, and caps the combined inventory at 500. Incomplete, changing or oversized inventory fails closed. The caller cannot choose inventory pages or filters.

`availableTierLabels` contains only LISTED global labels with no price row in the selected policy. A deleted price row still excludes its label. Plain reads and `tierPrice` preparation do not return this inventory. Linking therefore requires a previously observed valid label ID; if none is known, select it in the original authorized console. Do not probe with a fabricated ID to obtain options. Global label creation, renaming and archival are not provided by these methods.

Two consecutive business snapshots must agree before a result is returned. Comparison disregards generated `insertedAt`/`updatedAt` timestamps and normalizes price amounts for comparison. This detects observed drift; it is not an atomic snapshot or a guarantee against a later concurrent change.

## Result and next action

Successful reads return `code:TICKET_PRICING`, `policy`, `event`, `revision`, `verificationScope` and `writesPerformed:false`, with task type `commerce-ticket-pricing` and screen `channel.ticket-pricing`. A task type on a read is routing metadata, not a saved job. An operation preparation also returns the planned `request`; `null` means an existing-price change is a no-op. Link/unlink preparations can include `availableTierLabels` as described above.

Fresh validated tier results provide the selected event's exact [pricing destination](../guides/ticket-pricing.md#console-destination), not the parent event list. The metadata operation uses the separate home destination described below. An error does not produce a current verified link. Use the returned URL rather than reconstructing a console host.

`TICKET_PRICING_UNVERIFIED` indicates a mismatched or unsupported event/policy/price relationship; `TICKET_TIER_LABELS_UNVERIFIED` can indicate invalid or incomplete global-label inventory. `TICKET_PRICE_INVALID` requires correcting the intended price under the channel's rules. `COMMERCE_CHANGED` requires a fresh observation. Context, permission and service-boundary errors must be resolved without substituting another app, consumer or account. For a previously sent change, use its original task recovery instead of preparing a new request to bypass uncertainty.

<a id="policy-metadata-candidate"></a>

## Policy metadata

Use `operation:{"kind":"metadata","settings":{...}}` with the same selected channel, E00003 event and optional exact default policyId. The existing active-event/default-policy, permission, consumer, currency and context checks still apply. Management labels are distinct from global tier labels and price rows: use `labelId`/`labelIds`, not tierLabelId or eventPolicyTierPriceId.

| `settings` field | Input and meaning |
| --- | --- |
| `title` | Optional management policy name: 3–50 UTF-16 code units, no CR/LF, not all whitespace. Leading/trailing whitespace is preserved. Omission preserves the current value; blank text is invalid. |
| `presentationalTitle` | Optional public policy name, with the same text constraints and omission rule. This is not a translation editor. |
| `labelIds` | Optional array of 0–10 unique existing management label business IDs. Omission preserves the current membership; an explicit array replaces it, and `[]` unlinks all management labels from this policy. |

Empty `settings:{}` inspects the current metadata and options and normally returns a null request. Both retained/final names and the final label count must still satisfy the form, even if the caller changes only one field or inspects with empty settings. Invalid retained values fail preparation instead of being silently rewritten.

Metadata reads the existing event/default policy plus `GET /seller/api/v3/ticket-labels` with exactly `targetModel:EVENT_POLICY` and `sortBy:inserted_at`. The returned catalog is bounded at 500 with unique numeric and business label IDs; an optional returned consumer must match. There is no status/page selector, and the response does not provide pagination-total proof of omitted records. Metadata does not fetch the separate LISTED/ARCHIVED tier-label inventory.

Success adds `availableLabels`, containing the returned management-label catalog, to the usual policy/event/revision result. Labels carry labelId, title, presentationalTitle, presentationalOrder and status; accepted statuses are AVAILABLE and NOT_AVAILABLE. The contract does not filter choices to AVAILABLE, so do not invent that filter. Select exact observed IDs from availableLabels. Current linked label projections must exist in the catalog and agree in every returned business field; missing, conflicting or foreign data fails closed.

Catalog and linked labels are normalized by labelId. The supplied labelIds order does not control display order, and presentationalOrder is not editable. Existing global labels are not created, renamed, reordered, archived or deleted. The catalog and unedited returned event/policy fields, including prices and refund fields, must remain stable across observations.

Inspect metadata/options using an already observed event:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "operation": {"kind": "metadata", "settings": {}}
}
```

Prepare names and a complete management-label selection:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "policyId": "policy-example",
  "operation": {
    "kind": "metadata",
    "settings": {
      "title": "Standard policy",
      "presentationalTitle": "Standard admission",
      "labelIds": ["management-label-example"]
    }
  }
}
```

Independently, prepare clearing policy-label links while preserving both names:

```json
{
  "channelCode": "L2NoYW5uZWxzLzk4",
  "pAppCode": "E00003",
  "eventId": "event-example",
  "policyId": "policy-example",
  "operation": {"kind": "metadata", "settings": {"labelIds": []}}
}
```

Replace the illustrative IDs with current observations; the label must have been returned in the metadata catalog. Empty-settings inspection is not preparation for changed names or links. Prepare the exact final settings again, then copy its revision and policy.eventPolicyId into [metadata apply](ticket_pricing_apply.md#policy-metadata-candidate). A null request is a no-op, not an executed save.

Fresh metadata reads/preparations use the selected event's `base-pricing/home` destination. Plain discovery and tier operations continue to use `base-pricing/detail`; keep the single returned URL for the operation. The home destination requires valid current names, catalog/linked projections and the exact target/request. Pending or historical data does not provide a current verified link.