Skip to main content
GET
For products with inventorySelectionType: SEATMAP. Returns an HTML page that renders the Headout-hosted seat selection UI. Embed this endpoint as an iframe in your integration. Domain whitelisting required — contact the Headout partnerships team to register your domain. The seatmap iframe is a Headout-hosted, fully interactive seat selection UI. Embed it to support seatmap products without building custom seat selection. The endpoint returns a rendered HTML page — not a JSON payload. No API key is required; access is controlled by domain allowlisting.

Domain whitelisting

The iframe enforces an allowlist of permitted embedding domains. Before going live, contact the Headout partnerships team and provide the domain(s) you intend to embed the iframe on. Headout will add your domain to ALLOWED_DOMAINS.
  • Requests from domains not on the allowlist return 403 Forbidden.
  • The allowlist is matched against the browser-sent Referer header.
  • A request whose Referer is from an unregistered domain returns 403. The browser default Referrer-Policy (strict-origin-when-cross-origin) is fine: the allowlist matches on the origin. Do not apply Referrer-Policy: no-referrer.
  • Subdomains of a whitelisted domain are automatically permitted — whitelisting example.com also allows www.example.com.
  • The iframe sets a Content-Security-Policy: frame-ancestors response header scoped to your domain to prevent embedding from unauthorised origins.
Sandbox needs no whitelisting. https://www.sandbox-headout.com does not check the Referer header and allows embedding from any origin (frame-ancestors *), so you can embed from localhost or any development host without registering it. Whitelisting applies to production only: ask the Headout partnerships team to register your production domains ahead of launch.

Embedding

Add the iframe to your page with the product ID substituted in the src URL:
Replace 3023 with the actual product ID. To test against sandbox, use https://www.sandbox-headout.com as the host and one of the sandbox seatmap test products. Also replace every https://www.headout.com postMessage target origin and event.origin check below with https://www.sandbox-headout.com, otherwise the handshake silently never completes. The iframe container must have a defined height — height="100%" requires the parent element to have an explicit height set, otherwise the iframe collapses to 0px and nothing renders.

postMessage events

The iframe communicates with the parent page via window.postMessage. All messages in both directions are JSON-stringified in the following envelope:
Parse incoming messages with JSON.parse(event.data).

Initialisation sequence

The iframe does not load seats automatically. After embedding, you must complete the handshake and pass the selected show slot. 1. Send init once the iframe has loaded
2. Listen for iframeInitCompleted, then send initPlugin
Without initPlugin the map renders empty — no seats will be displayed. Events then arrive in this order: iframeInitCompleted, initializingSeatmapStarted, initializingSeatmapCompleted, inventoryUpdateStarted, inventoryUpdateCompleted; seat events follow user interaction.

Outbound events

All outbound events follow the envelope { "type": "...", "data": { ... } }.

Map lifecycle

Seat events

Handling onSeatSelectionSubmitted: You can read the current selection at any time from the latest onSeatSelectionChanged seats array.

Inventory events

Emitted on initial seatmap load (after initPlugin) and on every subsequent setInventorySlot call. inventoryMap is keyed by seat id (SE-…) and holds the whole slot’s inventory, so do not cap inbound message size tightly.

Price filter events

Zoom events

Other

Seat object

Each item in the seats array (from onSeatAdded, onSeatRemoved, onSeatSelectionChanged, and onSeatSelectionSubmitted) has the following shape:
Example seat
The iframe’s seatCode is not the same as the API seatCode. The value that Validate and Booking accept is the seat object’s id (e.g. SE-STALLS-K-118204) — that is the field matching seatCode in List Inventory - Seatmap. The iframe’s seatCode (e.g. 14K) is a short display label built from the seat number and row; sending it as a seatCodes element returns a SEAT_NOT_FOUND validation error.

Inbound commands

The parent can send commands to the iframe after initialisation: Send selectSeats, addSeat and removeSeat only after inventoryUpdateCompleted; ids that are not in the slot passed to initPlugin or setInventorySlot are ignored.

Security

The iframe only accepts messages originating from the whitelisted parentOrigin. Send all messages to https://www.headout.com (https://www.sandbox-headout.com in sandbox) as the target origin and, in production, ensure your domain is registered in ALLOWED_DOMAINS.

Next steps

Once onSeatSelectionSubmitted fires, pass the returned seat data to Validate to confirm availability, then proceed to Booking. Send each seat’s id as a seatCodes element to Validate and as an inventorySeatIds element to Booking; inventorySlotId is inventoryId in both requests.

Path Parameters

productId
integer
required

Product ID of the seatmap product.

Response

Seat selection HTML page rendered successfully.