Check-In System

Ticket Validation API

REST API endpoints for ticket validation, check-in, and attendee lookup.

4 min readUpdated 2025-01-12

The Ticket Validation API is what you reach for when BrightStar's built-in scanner isn't the whole story — when you're running your own check-in app at a kirtan door, wiring a third-party scanner into a retreat's gate, or building an automated access control system that needs to know who's allowed through and who already came in. It's a REST API, and it covers the three jobs any door needs done: checking whether a ticket is real, marking a ticket as arrived, and looking an attendee up. Because it's the same set of endpoints BrightStar's own scanner uses, building against it means building against something that's already been run through a real gate on a real morning.

What's the difference between validating a ticket and checking it in?

BrightStar splits looking at a ticket from acting on it into two separate calls. POST /v1/tickets/validate checks whether a ticket is real and returns its details — attendee name, ticket type, whether it's already been checked in — without changing anything. POST /v1/tickets/checkin does the same lookup and then writes the arrival: it marks the ticket checked in and stamps the moment it happened. If you only ever call /checkin, every read becomes a write, and there's no way to glance at a ticket without also using it up. Keeping the two separate means a volunteer can test a scanner, or answer 'is this a real ticket' at the merch table, without accidentally marking someone present before they've walked through the gate.

What happens when you check a ticket in?

A check-in call does two things at once: it confirms the ticket is good, and it commits the arrival. Here's what happens between sending the request and getting your response back:

  1. 1You send the ticket_id, and BrightStar looks it up against the ticket's real record.
  2. 2A ticket can be identified directly by its ticket_id, which is what a camera scanner reads at the gate, or by a time-limited code — that path also confirms the code hasn't expired or already been used, and marks it used before the check-in itself goes through.
  3. 3If the ticket is valid for this event and hasn't already been used, BrightStar marks it checked in and records the exact timestamp.
  4. 4You get back the attendee name, the ticket type, and the checked_in_at time that was just written.
  5. 5You can optionally attach a scanner_id and a GPS location, so the check-in record carries where and on what device it happened.

What happens when the API says no?

Not every rejection means the same thing, and treating them all alike at the door creates confusion. A ticket that doesn't exist returns INVALID_TICKET with a 404 — the ID was typed wrong, or it isn't a BrightStar ticket at all. ALREADY_CHECKED_IN, WRONG_EVENT, TICKET_CANCELLED, and EVENT_NOT_STARTED all come back as 400s: the ticket exists, but something about its state stops it going through. ALREADY_CHECKED_IN comes with the timestamp of the original scan, which is often enough to settle a 'someone's trying to use my ticket' conversation on the spot. WRONG_EVENT catches a ticket from one gathering being waved at the gate of another — useful at a multi-day festival where several stages each run their own check-in. TICKET_CANCELLED means the ticket was refunded and shouldn't be honored. EVENT_NOT_STARTED means check-in hasn't opened yet, which is a state, not a problem with the ticket itself. Separate from all of this, an authorization failure means the request itself wasn't allowed, regardless of the ticket. A missing, expired, or revoked credential comes back as 401 — re-authenticate and try again. A credential that's valid but was never granted access to this particular event comes back as 403, which means the device or person calling the API was never scoped to scan here, and retrying won't change that.

How do you know who scanned a ticket, and when?

BrightStar fires a ticket.checked_in webhook the moment a ticket is scanned, and the payload carries the ticket ID, the attendee, the timestamp, and the scanner_id — so any system listening can update its own view of the door in real time instead of polling for changes. If a check-in gets undone, a ticket.check_in_reverted webhook fires too, naming who reverted it and why, so the correction is on record rather than silently disappearing. The scanner_id you send with a check-in request is also what shows up in that webhook, which is why it's worth naming devices for the post they're stationed at — entrance_main, say — rather than for whoever happens to be holding the phone that day. An optional GPS location can ride along with the same request, giving you a record of where, not just when, a ticket was used.

Call /validate before doors open, and save /checkin for the moment someone actually walks through. A scanner that only ever validates during setup — testing that codes read cleanly, confirming a printed ticket matches the guest list — never accidentally marks anyone as arrived before the gathering has even started. Switch to /checkin only once the gate is live.

Who is allowed to call this API?

Access to the Validation API is scoped, not open-ended. A device or person authenticates once, and that session carries an explicit list of which events it's allowed to touch — a request naming any other event is refused outright, so a scanner set up for one retreat can't be pointed at another's guest list. Sessions can be revoked from the event's scanner-devices screen, and BrightStar rechecks that a session hasn't been revoked or expired on every single call, rather than trusting a credential just because it was valid earlier. That matters most at the end of a gathering, or the moment a volunteer's phone goes missing.

Common questions

Can I build my own check-in app on top of BrightStar?

Yes. The BrightStar Validation API is a REST API intended for custom check-in integrations, third-party scanner apps, and automated access control systems. It covers ticket validation, check-in, and attendee lookup.

Read more

The same endpoints back BrightStar's own scanner, which is a useful reference for how a third-party client is expected to behave. It authenticates once by exchanging a short code for a device session, then presents that session on every subsequent request. The session carries an explicit list of event IDs and a request naming any other event is refused, so a client cannot widen its own reach. Sessions can be revoked from the event's scanner-devices screen, and the server re-checks revocation and expiry on every call rather than trusting a credential simply because it was issued earlier.

What is the difference between the validate and checkin endpoints?

In the BrightStar Validation API, POST /v1/tickets/validate checks a ticket without checking it in, while POST /v1/tickets/checkin validates and marks the ticket as checked in. BrightStar suggests using /validate for pre-checks, such as before the event starts, and /checkin for actual entry, which prevents accidental early check-ins.

Read more

The two endpoints let you separate looking at a ticket from acting on it. A gate that only calls /validate can display attendee details before doors open without marking anyone as arrived, which matters if a volunteer is testing scanners or answering a question mid-conversation. Only /checkin writes the checked_in flag and the checked_in_at timestamp, so a person only counts as arrived once they've actually been let through.

How do I check a ticket in through the BrightStar API?

Send a POST to /v1/tickets/checkin with the ticket_id in the body. You can optionally include scanner_id for tracking and a location object with lat and lng for GPS. A 200 response returns success along with the ticket ID, type, attendee name, checked_in status and the checked_in_at timestamp.

Read more

A request may identify the ticket in one of two ways. A direct ticket reference is accepted, which is what the camera scanners use, since the code they read is the event and the ticket paired together. Alternatively a time-limited code can be presented; that path additionally confirms the code has not expired and has not already been redeemed, and marks it redeemed before the check-in itself is attempted. Either way the event has to be named in the request, and a successful response carries the attendee name, the resolved ticket-type title and the exact timestamp that was written to the ticket.

What errors does the BrightStar ticket validation API return?

BrightStar returns INVALID_TICKET with HTTP 404 when the ticket ID is not found, and four HTTP 400 errors: ALREADY_CHECKED_IN, which also includes the checked_in_at timestamp, WRONG_EVENT when the ticket belongs to a different event, TICKET_CANCELLED when the ticket was refunded or cancelled, and EVENT_NOT_STARTED when check-in is not open yet.

Read more

Authorization failures are a separate class from ticket problems, and worth handling separately in a client. A missing, expired or revoked credential returns 401, which means re-authenticate. A credential that is perfectly valid but not scoped to the event being scanned returns 403, which means the device was never granted that event and retrying will not help. Scope is resolved on each request rather than cached: for a paired device it is the event list fixed when it was set up, and for a signed-in person it is event ownership or a role carrying the scan permission.

Can I get notified when a ticket is scanned?

Yes. BrightStar fires a ticket.checked_in webhook when a ticket is scanned, carrying the ticket ID, attendee, timestamp and scanner ID. A ticket.check_in_reverted webhook fires when a check-in is undone, carrying the ticket ID, who reverted it, and the reason.

Read more

This is the same webhook system used for ticket.checked_in, so a client subscribed to both events can update its own display back to 'not checked in' the moment someone at the door reverses a scan. Because the reverted payload names who reverted it and why, a downstream system can log the correction as its own event rather than silently overwriting the original check-in record.

Can I tell which entrance a ticket was scanned at through the API?

Yes. The BrightStar check-in endpoint accepts an optional scanner_id, such as entrance_main, for tracking purposes, and an optional GPS location. The scanner_id is also included in the data sent with the ticket.checked_in webhook.

Read more

What is recorded against the ticket is the device that performed the check-in, together with how it happened — a live scan, a manual selection from the roster, or a replayed offline scan. The human-readable label comes from the operator name chosen when that device was set up, which is why naming it for the post rather than the person tends to be more useful when you read the records back weeks later. The name cannot be changed afterwards, so it is worth settling the convention before the codes go out to volunteers.

Ready to get started?

Create your first event on EveryEvent Bangkok — it’s free.