> ## Documentation Index
> Fetch the complete documentation index at: https://learn.nexudus.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Event Product

> Returns detail for a specific ticket product belonging to a published event.

# Get Event Product

Returns the full detail for a single ticket product associated with a published event. Used during the event checkout flow to confirm product availability and price before purchase.

## Authentication

No authentication required.

## Path Parameters

<ParamField path="eventId" type="number" required>
  The integer ID of the event. Obtained as `Id` from `GET /api/public/events` or `GET /api/public/events/{id}`.
</ParamField>

<ParamField path="productId" type="number" required>
  The integer ID of the ticket product. Obtained as `EventProducts[].Id` from `GET /api/public/events/{id}`.
</ParamField>

## Query Parameters

<ParamField query="_shape" type="string">
  Comma-separated list of field paths to include in the response. When provided, only the
  specified fields are returned — useful for reducing payload size. Supports nested paths
  using dot notation.
</ParamField>

## Response

Returns an `EventProduct` object.

### Core Fields

<ResponseField name="Id" type="number" required>
  Unique identifier for the ticket product.
</ResponseField>

<ResponseField name="Name" type="string" required>
  Display name of the ticket type (e.g. "General Admission", "VIP Pass").
</ResponseField>

<ResponseField name="Description" type="string">
  Optional description shown to customers during checkout.
</ResponseField>

<ResponseField name="Price" type="number">
  Ticket price. `0` for free tickets.
</ResponseField>

<ResponseField name="PriceCurrencyCode" type="string">
  ISO 4217 currency code (e.g. `"GBP"`, `"USD"`, `"EUR"`).
</ResponseField>

<ResponseField name="PriceFormatted" type="string">
  Localised price string including currency symbol (e.g. `"£12.00"`). Use this for display rather than formatting `Price` manually.
</ResponseField>

<ResponseField name="Currency" type="Currency">
  Full currency object from the business configuration.
</ResponseField>

### Availability

<ResponseField name="IsAvailableNow" type="boolean">
  When `true`, the ticket is within its sale window and has stock remaining.
</ResponseField>

<ResponseField name="SoldOut" type="boolean">
  When `true`, all available spots for this ticket type have been claimed.
</ResponseField>

<ResponseField name="TicketsLeft" type="number">
  Remaining ticket count. `0` when sold out.
</ResponseField>

<ResponseField name="LastFew" type="boolean">
  When `true`, fewer than a threshold number of tickets remain — used to display urgency messaging.
</ResponseField>

<ResponseField name="MaxTicketsPerAttendee" type="number | null">
  Maximum number of tickets a single customer can purchase. `null` means no limit.
</ResponseField>

<ResponseField name="Quantity" type="number">
  Total initial allocation for this ticket type.
</ResponseField>

### Sale Window

<ResponseField name="StartDate" type="string">
  Local datetime from which this ticket type goes on sale (ISO 8601).
</ResponseField>

<ResponseField name="EndDate" type="string">
  Local datetime after which this ticket type is no longer available (ISO 8601).
</ResponseField>

<ResponseField name="StartDateFormatted" type="string">
  Human-readable formatted start date.
</ResponseField>

<ResponseField name="EndDateFormatted" type="string">
  Human-readable formatted end date.
</ResponseField>

<ResponseField name="Expired" type="boolean">
  When `true`, the sale window has passed and tickets can no longer be purchased.
</ResponseField>

<ResponseField name="Future" type="boolean">
  When `true`, the sale window has not yet opened.
</ResponseField>

<ResponseField name="DisplayOrder" type="number">
  Operator-defined ordering position for display in ticket lists.
</ResponseField>

### Timestamps

All datetime fields are ISO 8601 strings. `*On` fields are in the location's local timezone; `*OnUtc` fields are UTC.

<ResponseField name="CreatedOn" type="string">
  Local datetime the ticket product was created.
</ResponseField>

<ResponseField name="CreatedOnUtc" type="string">
  UTC datetime the ticket product was created.
</ResponseField>

<ResponseField name="UpdatedOn" type="string">
  Local datetime of the last update.
</ResponseField>

<ResponseField name="UpdatedOnUtc" type="string">
  UTC datetime of the last update.
</ResponseField>

## Examples

### Fetch a ticket product

```http theme={null}
GET /api/public/events/412/product/88
```

```json theme={null}
{
  "Id": 88,
  "Name": "General Admission",
  "Description": "Standard entry ticket. Includes refreshments.",
  "Price": 15.0,
  "PriceCurrencyCode": "GBP",
  "PriceFormatted": "£15.00",
  "Currency": { "Code": "GBP", "Symbol": "£" },
  "IsAvailableNow": true,
  "SoldOut": false,
  "TicketsLeft": 13,
  "LastFew": false,
  "MaxTicketsPerAttendee": 2,
  "Quantity": 20,
  "StartDate": "2026-01-01T00:00:00",
  "EndDate": "2026-03-23T08:15:00",
  "StartDateFormatted": "1 Jan 2026",
  "EndDateFormatted": "23 Mar 2026",
  "Expired": false,
  "Future": false,
  "DisplayOrder": 1,
  "UniqueId": "d4e5f6a7-b8c9-0123-def0-234567890123",
  "IdString": "88",
  "CreatedOn": "2025-11-01T09:00:00",
  "UpdatedOn": "2026-03-01T12:00:00",
  "CreatedOnUtc": "2025-11-01T09:00:00Z",
  "UpdatedOnUtc": "2026-03-01T12:00:00Z",
  "IsNull": false
}
```

## TypeScript Integration

```typescript theme={null}
import endpoints from '@/api/endpoints'
import { EventProduct } from '@/types/endpoints/EventList'
import { useData } from '@/api/fetchData'

const endpoint = endpoints.events.product(412, 88)

const { resource: product } = useData<EventProduct>(httpClient, endpoint.url)
```

## Error Responses

<ResponseField name="404 Not Found" type="error">
  No event with `eventId` or no ticket product with `productId` exists, or the product does not belong to the specified event.
</ResponseField>

## Related Endpoints

| Method | Endpoint                                  | Description                                     |
| ------ | ----------------------------------------- | ----------------------------------------------- |
| `GET`  | `/api/public/events/{id}`                 | Full event detail including all ticket products |
| `GET`  | `/api/public/events`                      | Paginated list of published events              |
| `POST` | `/api/public/events/{id}/joinWaitingList` | Join the waiting list for a sold-out event      |
