Buy a ticket on the resale exchange

Buy another member's ticket with a card or house credit and get a brand-new pass.

Owned by Member · 10 steps · about 12 minutes

Why this exists

Buying on the exchange is one atomic act: your money moves, the split is posted to the ledger, the ticket changes owner, the seller's credential is destroyed and yours is minted — all inside one transaction. There is no window in which you have paid and do not have a ticket, and none in which two people hold working credentials for the same seat.

The concurrency design is worth understanding because it produces the error you are most likely to hit. A purchase first claims the listing, moving it from active to settling under a write lock; the buyer who loses that race is told the listing is no longer active, before anyone's card is touched. Nothing is authorised from a stale page: the ticket and the event are re-read under the claim, and a ticket that has since been refunded, checked in or transferred closes the listing instead of selling it.

Your new pass is genuinely new — new serial, new secret, new payload. The seller's old credential is not merely deactivated: its serial and payload hash are blacklisted, so the old NFC card scans red with "resold" and the old QR scans red as revoked. Even offline readers learn about it through the revocation list in their sync bundle.

You may pay by card or from house credit. Paying from credit uses the same fixed spend order as anywhere else — prepaid, then earned, then a VIP tab — which is the one place VIP status changes what you can afford here.

Before you start

  • A member session (any registered account can buy).
  • An event with at least one active listing — the seed ships one on the demo event.
  • Enough purchasing power if you intend to pay from credit.

Practise with

PersonaEmailPasswordNote
membermember@club.test member123the buyer; the seeded listing belongs to someone else, so self-purchase is not in the way
vip_membervip@club.test vip123can settle the same listing from the tab
door_staffdoor@club.test door123proves the credential swap at the scanner
adminadmin@club.test admin123reads the settlement and its split

Steps 1–5 — Member

their manual →
  1. 1
    Open the exchange index and pick an event with listings.
    /exchange resale
    Expected result Events whose exchange is open, with a count of active listings.
    Watch out for This page needs a session. There is no public view of the exchange, by design.
  2. 2
    Open the event's marketplace and read the listings per tier.
    /events/{event_id}/exchange resale
    Expected result Two sections — Member exchange and Public release — each sorted by price ascending, with face value alongside and your purchasing power shown for the credit option.
    Watch out for You never see who is selling. If a listing looks like a bargain, the reason is the price bounds, not a stranger being generous.
  3. 3
    Read the Member exchange section: every listing there is inside its member-first window, and each one counts down to the moment it opens to everybody.
    /events/{event_id}/exchange resale
    Expected result A countdown per listing spelled out in words — “public in 1 day 23 h” — and the same listing sitting under Public release once that runs out.
    Watch out for The window is 48 hours from the moment the ticket was LISTED, not from when the show sold out, and it is set per event by the venue manager (0 turns it off). Nothing is stored: the phase is recomputed from the listing time on every read, so there is no state to go stale and no job to miss.
  4. 4
    Look at the same state as JSON to see the mechanics: per-tier active flag, floor, cap and the listing array.
    /api/resale/events/{event_id} resale
    Expected result Exchange state including whether the event is locked and when the post-doors lock will engage.
    Watch out for Reading this quietly re-syncs whether each tier's exchange should be active from live sold counts. The exchange can therefore open for you between two page loads with nobody having pressed anything. The payload is also scoped to YOU: each listing carries its phase and public_at, and a caller without a membership tier is served only the public ones plus a count of what is still held back.
  5. 5
    Buy with a card. Press Buy, choose Card, and confirm.
    /api/resale/listings/{listing_id}/purchase POST resale
    Expected result A settlement with the price, venue fee, host royalty, seller net, and the id of your brand-new pass.
    Watch out for Buying your own listing is a 403, and so is buying a member-first listing without a membership tier (MEMBER_WINDOW_ACTIVE, and the message names the hour it opens). Losing the race is a 409 saying the listing is no longer active — reload and pick another; nothing was charged. A declined card leaves the listing active and records a failed settlement, so you can simply try again.

Steps 6 — VIP Member

their manual →

Settles the same purchase from tab headroom rather than a card.

  1. 6
    As a VIP, buy a listing with house credit instead.
    /api/resale/listings/{listing_id}/purchase POST resale
    Expected result Prepaid is spent first, then earned, then tab headroom, as one balanced posting.
    Watch out for If all three together fall short, the purchase is refused with a 402 and the claim is released for the next buyer. No partial payment, and no listing left stuck in settling.

Steps 7–8 — Member

their manual →
  1. 7
    Confirm what you bought.
    Expected result Your completed settlements with what you paid and which ticket you now own.
  2. 8
    Open your wallet. The purchase response points you straight here.
    Expected result A new pass with a new serial and the tier's zones, ready to scan.
    Watch out for The ticket is the same row it always was — only the credential is new. If someone shows you an older screenshot of 'the same ticket', it is worthless, and that is the design working.

Steps 9 — Door Staff

their manual →

Confirms the new pass works and the seller's old one does not.

  1. 9
    Scan the buyer's new pass, then scan the seller's old one.
    /api/access/scan POST access
    Expected result Green for the buyer. Red for the seller — 'resold' on the old NFC payload, revoked on the old QR.
    Watch out for Two different red reasons for the same event is not inconsistency: the NFC path recognises the blacklisted serial, while the QR path fails because the secret behind it was killed.

Steps 10 — Admin

their manual →

Sees the settlement, the split and the ledger transaction behind it.

  1. 10
    As an admin, read the settlement list for the event and check a split against the configuration.
    /admin/resale/{event_id} resale
    Expected result Settlements with gross, venue fee, host royalty and seller net, plus totals.
    Watch out for If the event is later cancelled, these settlements are unwound newest-first before the primary orders are refunded, so a chain of resales walks the ticket back one owner at a time. That is an admin workflow, not something a member can trigger.