Search Time Slots

Browse-oriented endpoint for calendar UIs: returns every time slot for an item across a date range, with optional indicative pricing and current capacity. Designed for use cases like a 30-day calendar UI or a realtime capacity check across a date window. This endpoint is **not** a replacement for [`getCapacity`](./getCapacity) — that endpoint stays as the single-date, at-checkout call carrying `customerNumber` for personalized pricing and authoritative capacity validation. Prices here are **indicative** — `customerNumber` and `quantity` aren't accepted, so customer-specific pricing, price ladders, and quantity discounts are not applied. Slot-level **dynamic pricing is** applied and surfaces as `priceDelta` on each time slot (see "Per-unit math" below for how to combine it with `basePrice`). Capacity is accurate at the moment of the response but drifts as bookings come in. Re-validate at the slot the customer actually picks. ## Date-range cap The range cap is **62 days** (`toDate - fromDate + 1`). Larger ranges return `400`. ## Times are admission-local All `*Date` / `*Time` fields are local at the admission. **No timezone offset is attached.** Do not parse the time fields as UTC. `endDate` can differ from `startDate` for slots that cross midnight. ## Per-unit math Both `basePrice` (in `datePrices`) and `priceDelta` (on each time slot) are **per unit**. Reconstruct the charged price by combining them — what to combine depends on the component shape: - **Single-admission ticket component** — pick a slot, then per-unit price is `basePrice` (for that component and date) `+` the chosen slot's `priceDelta`. - **Multi-admission ticket component** — `basePrice` is carried **once**, on the default admission's `datePrices` row. A non-default admission's `priceDelta` is its **incremental** contribution, not a standalone price — do not add the base per admission. Per-unit price = `basePrice` (default admission's row, for the date) `+ Σ` chosen slot's `priceDelta` across the admissions the customer is buying. - **Non-admission component** (coupon, fee, etc.) — per-unit price is the `basePrice` from its `datePrices` row for the date. No `priceDelta` applies; the component doesn't appear in `timeSlots[]`. Multiply by `items[].quantity` to get each component's contribution to the package total, then sum across components. This matches what the actual charged price will be: the per-slot dynamic adjustment is computed against the price-list price for the date, and any package-level discount is applied last. **What `basePrice` and `priceDelta` carry:** - `basePrice` reflects the price-list price for the date (so it tracks scheduled price-list changes, e.g. seasonal pricing) with any package-level discount applied. It does **not** include the per-slot dynamic adjustment. - `priceDelta` carries the per-slot dynamic rule (fixed, relative, or percentage), with the same package-level discount applied so `basePrice + priceDelta` reconciles cleanly to the discounted total. ## Capacity semantics When `withCapacity=true`, each time slot carries a `capacityControl` field — one of `none`, `sales`, `admitted`, or `full`. Branch on it: - `none` — capacity is not tracked for this slot. `remainingCapacity` is **omitted**. Render as "Available" / "Unlimited" — there is no number to display. - Any other value — `remainingCapacity` is present and is the actual count. `0` means sold out. The number's semantics differ by mode (e.g. `sales` counts initial sales, `admitted` counts admitted entries) — interpret with `capacityControl` for accuracy across modes. `capacityControl` is **per slot, not per admission** — the same admission may have different effective modes on different slots. ## v1 inclusion scope Only `mandatory` admissions are emitted in v1. Opt-in and opt-out admissions (`optionalAndSelected`, `optionalNotSelected`) and their addon-experience pricing are out of scope for v1. ## Decomposition The input item is resolved into one or more components, and each ticket component carries one or more admissions: - **Input item → components.** For a single ticket item, `items[]` has exactly one entry. For a package, `items[]` has one entry per underlying item in the package. Components are one of two kinds: - **Ticket components** — items configured as tickets. They appear in `items[]` with at least one entry in `admissions[]`, in `datePrices[]` with the default admission's code, and in `timeSlots[]`. - **Non-admission components** — items like coupons or fees that are part of the package but don't have admissions. They appear in `items[]` with an **empty** `admissions` array, and in `datePrices[]` with `admissionCode: ""` (blank). They never appear in `timeSlots[]` — there's no schedule to attach to. - **Ticket component → admissions.** Each ticket component's `admissions[]` lists every admission the ticket grants access to. A simple ticket grants one; a combo ticket grants several. See "v1 inclusion scope" for which admissions are emitted today. ## What this endpoint does not do - No `customerNumber` — use [`getCapacity`](./getCapacity) for personalized pricing. - No `quantity` — defaults to 1; the caller multiplies by `items[].quantity`. - No rolled-up `packagePrice` / `packageAvailable` — the caller composes from per-row data. - No timezone offsets on time fields (see above). - Slots whose sales window has ended are not filtered here — that's a [`getCapacity`](./getCapacity) concern at point-of-purchase. Cancelled slots and slots not marked visible-on-web are excluded. Consumers can pass `scheduleNumber` from a `timeSlots[]` row directly to [`createReservation`](./createReservation) and to [`getCapacity`](./getCapacity) — same field name, same value, no translation.

Authentication

x-np-api-keystring
API Key authentication via header

Path parameters

tenantstringRequired

Your Entra Tenant ID. More details.

environmentstringRequired

Your Business Central Environment. More details.

companystringRequired

Your Business Central Company. More details.

Headers

x-api-versiondateOptional

Used for API versioning. More details.

Query parameters

itemNumberstringRequired
An item or product number defined in the ticketing system
fromDatedateOptional

Start of the date range (inclusive), YYYY-MM-DD. Defaults to today.

toDatedateOptional

End of the date range (inclusive), YYYY-MM-DD. Defaults to fromDate + 30 days. The total span toDate - fromDate + 1 may not exceed 62 days.

withPricebooleanOptional

When true, the response includes the datePrices array (per-date basePrice) and a priceDelta on each time slot. Defaults to false.

withCapacitybooleanOptional

When true, each time slot carries capacityControl; if that mode tracks capacity, remainingCapacity is also present. Defaults to false.

Response

The decomposed item structure, indicative pricing per date (when requested), and the list of slots in the date range.

itemNumberstring
An item or product number defined in the ticketing system
itemslist of objects
timeSlotslist of objects
datePriceslist of objects