Integrations & API

REST API Reference

Complete API documentation with endpoints, request/response formats, and examples.

4 min readUpdated 2025-01-15

The BrightStar REST API gives you programmatic access to events, tickets, orders, and attendees — the same data behind BrightStar's own dashboard, reachable through code instead of a browser. Every endpoint speaks JSON, and every request has to be authenticated, so before you build anything against it you need an API key and a plan for where each call fits into your own systems. That might be a check-in app pulling the attendee list moments before doors open at a kirtan night, a script pulling recent orders for reconciliation after a retreat closes registration, or a custom form that creates an event and then reads back its ticket types. All of it starts at the same base URL and passes through the same authentication check before it touches any real data.

Authenticating requests

Every call to https://api.brightstarevents.com/v1 needs an Authorization header in the form Bearer {your_api_key}, plus a Content-Type of application/json. BrightStar keeps only a hash of your key, never the key itself — it's shown to you once, when it's created, and after that the API can recognize it but not reveal it. That matters if a database is ever exposed: a leaked hash doesn't produce a working credential.

Revoking a key doesn't delete its record, it marks it revoked, and because every request has to match against an unrevoked key, the change takes effect on the very next call — there's no delay where an old key keeps working. The check is fail-closed throughout: a malformed key, a revoked key, and even an error looking one up all resolve to no access, never to access by default. A bad or missing key returns HTTP 401; a valid key that isn't permitted to do what you're asking returns 403.

Creating and managing events

The events endpoints follow a listing's lifecycle. GET /v1/events lists what exists, with status, limit, offset and sort parameters, so you can pull just your published events or just your drafts. GET /v1/events/{event_id} fetches one in full, POST /v1/events creates a new one from a body with title, description, start_date and the rest of a listing's fields, and PATCH /v1/events/{event_id} updates only the fields you send.

DELETE /v1/events/{event_id} only works on a draft. Once an event moves past draft, tickets may already be selling against it, which means there could be real orders and real attendees riding on it — deleting it outright would orphan all of that. So the delete endpoint is deliberately limited to the one stage where nothing has been sold yet.

Tickets, orders, and your attendee list

Ticket types live under an event: GET /v1/events/{event_id}/tickets lists them, POST /v1/events/{event_id}/tickets creates one with a name, price and quantity, and PATCH /v1/tickets/{ticket_type_id} updates an existing type. Orders sit a level up — GET /v1/events/{event_id}/orders lists them with status and date filters, GET /v1/orders/{order_id} returns one in full, POST /v1/orders/{order_id}/refund issues a refund with an optional amount and a reason, and POST /v1/orders/{order_id}/resend resends the order confirmation to whoever bought it.

Attendees have their own endpoint, GET /v1/events/{event_id}/attendees, filterable by ticket_type and checked_in — because a buyer and an attendee aren't always the same person; one order can hold several tickets, each belonging to someone different. That's the endpoint to call for a door list, not the orders endpoint, when what you need is who is actually walking in.

How pagination keeps large lists manageable

Any endpoint that returns a list takes limit and offset parameters. limit controls how many results come back, defaulting to 20 and capping at 100; offset tells the API how many results to skip before it starts counting. GET /v1/events?limit=20&offset=40 returns results 41 through 60. The headers X-Total-Count, X-Page and X-Per-Page tell you how many results exist in total and where the current page sits, so your code knows when to stop asking.

Ordering stays stable even when two records were created in the same second, since results sort by creation time with the record's own ID as a tiebreaker — a page boundary landing between near-simultaneous records never skips one or returns it twice. There's also a cursor mode for pulling a full history rather than a snapshot: give it a starting timestamp and results come back oldest-first from there, and advancing the cursor to the last record's creation time each round walks the whole history without gaps.

Reading error responses

Every error comes back in the same shape — a JSON object with an error field holding a code, a human-readable message, and, where relevant, the specific field that caused the problem, like a missing title. The HTTP status tells you the category before you even open the body: 200 and 201 mean success, 400 means the input was invalid, 401 means the key was missing or wrong, 403 means the key is valid but not permitted to do that particular thing, 404 means the resource doesn't exist, 429 means you're being rate limited, and 500 means something broke on BrightStar's side. Checking the status code first and the error code second is usually enough to route a failure automatically instead of surfacing a raw response to a person.

Build against https://api.brightstarevents.com/v1/test with a key that starts bs_test_, not your live key. Test events and orders created there don't touch production data or billing, so you can create draft events, issue refunds, or push attendee numbers up and down as many times as the work requires without any of it showing up on a real event page or a real invoice.

Common questions

Does BrightStar have an API?

Yes. The BrightStar REST API gives programmatic access to events, tickets, orders and attendees. All endpoints use JSON and require authentication, and the base URL is https://api.brightstarevents.com/v1.

Read more

Access to attendee data through the API is opt-in per event rather than automatic. An organizer switches sync on for a specific event, and only events they own and have enabled are visible to a key at all — everything else stays invisible even to a valid credential. Two consent rules are applied on the way out: anyone who has unsubscribed or been suppressed is excluded entirely, and for everyone else the record carries a marketing-consent flag and the date it was given, so the receiving system can apply its own gate rather than assume permission. Refund records are treated as transactional and are not filtered this way.

How do I authenticate with the BrightStar API?

Send your API key as a bearer token in the Authorization header, in the form Authorization: Bearer {your_api_key}, along with Content-Type: application/json. BrightStar returns HTTP 401 for a bad or missing API key and HTTP 403 when the key has insufficient permissions.

Read more

Only a hash of the key is ever kept. When a key is created the full value is shown once and never stored, so verification works by hashing what the caller presents and looking that up — a database leak cannot yield a working credential. Revoking a key marks it revoked rather than deleting it, and because verification requires an unrevoked record the change takes effect on the very next request. The check is fail-closed throughout: a malformed credential, a revoked key, or even a database error all resolve to no access rather than quietly defaulting open.

Is there a sandbox or test mode for the BrightStar API?

Yes. BrightStar provides a test environment at https://api.brightstarevents.com/v1/test, used with test API keys that begin with bs_test_. Test events and orders do not affect your production data or billing, so it is the recommended environment for development.

Read more

Working in the test environment means you can create events, issue refunds, and simulate check-ins as many times as it takes to get your integration right, with none of it appearing on a real event page or a real invoice. Because test keys are visibly prefixed bs_test_, it's also easy to confirm at a glance, in code or in logs, whether a given request went to test or to production.

Can I create and update events through the BrightStar API?

Yes. BrightStar exposes GET /v1/events to list events with status, limit, offset and sort parameters, GET /v1/events/{event_id} to fetch one, POST /v1/events to create with a body containing title, description, start_date and other fields, and PATCH /v1/events/{event_id} to update. DELETE /v1/events/{event_id} is available for draft events only.

Read more

The delete restriction exists because once an event leaves draft status it usually already has ticket types, orders and attendees attached to it, and removing it outright would orphan that real activity. Draft events carry no such risk, since nothing has been sold yet, which is why deletion through the API is limited to that one stage rather than being available at every point in an event's life.

How do I pull my attendee list through the API?

Call GET /v1/events/{event_id}/attendees on the BrightStar API to retrieve sold tickets. The endpoint accepts ticket_type, checked_in, limit and offset parameters, so you can filter to a single ticket type or to attendees who have or have not checked in.

Read more

There are two shapes to choose between, because a buyer and an attendee are not the same person. One record per completed order gives you the purchaser and the tickets they bought; one record per registrant gives you every named individual, which is what you want if the goal is a complete list rather than a sales list. Both carry contact details, an address assembled into a consistent structure whichever format checkout happened to store, and the answers to any custom questions — already resolved from internal question IDs into the labels the organizer wrote, with multi-select answers joined into a single readable string.

How does pagination work on the BrightStar API?

BrightStar uses limit and offset parameters, where limit defaults to 20 results and caps at 100, and offset skips a number of results. Responses include X-Total-Count, X-Page and X-Per-Page headers, so a call to GET /v1/events?limit=20&offset=40 returns results 41 to 60 of the total.

Read more

Ordering is deterministic even when records share a timestamp: results are ordered by creation time with the record's own identifier as a tiebreaker, so a page boundary falling between two records written in the same second cannot skip one or return it twice. There is also a cursor mode for catching up rather than keeping up. Give it a starting timestamp and results come back oldest-first from that point, so advancing the cursor to the last record's creation time each round walks the entire history in order without gaps.

Ready to get started?

Create your first event on EveryEvent Rio de Janeiro — it’s free.