The seating engine behind Eventhub

Design any venue.
Sell every seat.

Eventhub Seats is the seating‑chart and booking engine for ticketing platforms — a visual venue designer, an embeddable seat‑picker, and a real‑time booking API that never double‑books.

Transactional locking — no seat is ever sold twice, even under an on‑sale rush.
Grand Hall · live availability
Stage
Available Selected Held Booked
Seat A‑12 heldfrees in 4:58
VIP · 15,000 ֏ticket type applied

Built for the platforms selling tickets in emerging markets

EventhubRestohub
How it works

From empty hall to sold out in three steps

Everything an organizer and a developer need — the same engine powers the admin console and your storefront.

1

Design the venue

Draw rows, tables, GA zones and multi‑floor halls in the visual designer. Rotate, align, bulk‑edit, undo — publish immutable versions when you're ready.

2

Embed the picker

Drop one <script> into your page. Buyers pick seats and ticket types on desktop or mobile, in Armenian, Russian or English — availability updates live.

3

Sell in real time

Hold, best‑available and book through the REST API. The server prices every ticket type, freezes an immutable order, and fires signed webhooks to your backend.

Features

A complete seating stack, not just a map

Designer, renderer, booking core and webhooks — one coherent system your team and your partners can build on.

✏️

Visual venue designer

Rows, curved sections, tables, GA areas, background images and multi‑floor layouts — with copy/paste, alignment tools and full undo/redo.

🧩

Embeddable widget

A single self‑contained script renders the chart, manages the hold‑token session, and emits the buyer's selection to your checkout.

⚡

Real‑time availability

Server‑sent events push every status change to every open chart in ~250ms — batched so a stadium on‑sale won't melt the pipe.

🎟️

Server‑priced ticket types

Adult/Child/VIP levels priced and validated server‑side, frozen at booking. The client never sets a price — no tampering.

🔒

Never double‑books

Every hold and book runs inside a SELECT … FOR UPDATE transaction. Concurrency is physically impossible to oversell.

🪝

Signed webhooks

An append‑only status log drives at‑least‑once, HMAC‑signed webhooks with resume cursors — reconcile orders with confidence.

🌍

Multi‑language

Buyer‑facing UI and chart labels in Armenian, Russian and English out of the box, with locale‑aware pricing.

🧭

Best‑available & GA

Let the server pick the best adjacent seats, or sell general‑admission and book‑by‑table areas with capacity ledgers.

🛡️

Partner‑grade security

Workspace‑scoped keys, rate limiting, SSRF‑guarded webhooks and idempotent writes — ready for real money and real partners.

For developers

Two lines to render. One call to book.

A public key renders and holds in the browser. Your server books with a secret key after payment — the seat can never be sold twice in between.

  • REST API with Idempotency‑Key replay for safe retries
  • seats.io‑compatible hold‑token session model
  • Structured error codes & OpenAPI docs at /docs
  • Self‑host it, or run it as your workspace tenant
Read the API reference →
checkout.html
<!-- 1. Render the seating chart -->
<div id="chart"></div>
<script src="https://seats.eventhub.am/embed/chart.js"></script>
<script>
  new EventHubSeats.SeatingChart({
    divId:     'chart',
    publicKey: 'pk_live_…',
    event:     'grand-hall-oct-12',
    session:   'continue',        // holds survive reload
    onSelectionChange: (refs, detail) => renderCart(detail),
  }).render();
</script>

// 2. Book server-side after payment (secret key)
await fetch(`/events/grand-hall-oct-12/actions/book`, {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${SECRET_KEY}` },
  body: JSON.stringify({ objects: ['A-12'], holdToken, orderRef,
                          levels: { 'A-12': 'lvl_vip' } }),
});
Built to scale

Engineered for the on‑sale rush

The hard problems in ticketing are concurrency and correctness. We solved those first.

0

double‑bookings — enforced by the database, not by hope

~250ms

batched real‑time updates across every open chart

3

languages built in — Armenian, Russian, English

100%

server‑authoritative pricing — immutable order snapshots

Ready to seat your next sell‑out?

Spin up a workspace, design your venue, and embed the picker in an afternoon. We'll help you go live.

Get started free Book a demo