Beyond Gates integration API
Send your registrants to Beyond Gates as they sign up on your platform. They can then print their event badge at our self-service kiosks by scanning the QR code your platform already gave them, and enter through our gates with it.
There are three ways to connect. All of them feed the same pipeline:
| Method | Who calls whom | Delay to our kiosks |
|---|---|---|
| Push | You call our endpoint with an API key | Immediate |
| Webhook | You call our endpoint, signing each request | Immediate |
| Pull | We call your API on a schedule | Up to 30 seconds |
The API speaks JSON over HTTPS. You send your records in your own format: we map your field names once, during setup. People also register on the event day, so whichever method you choose must deliver a registrant before they reach our kiosk.
Authentication
Each integration belongs to one event and has its own endpoint. We send you its integration_id with its credentials when we set it up, first for a test event, then for the live one.
- Push authenticates with an API key starting with
bgk_, sent asAuthorization: Bearer bgk_…orX-Api-Key: bgk_…. - Webhooks authenticate with a signature of each request: see Signing requests.
- Pull uses the token or key of your API, which we store encrypted.
Errors
We answer with standard HTTP status codes. A 200 means the request was processed, but individual registrants can still fail: read failed and errors in the ingest summary.
| Status | Meaning |
|---|---|
| 200 | Processed; see the counts and errors in the summary |
| 400 | The body is not valid JSON |
| 401 | Missing or wrong API key or signature, or the integration is paused |
| 403 | This integration is set up for Pull and accepts no requests |
| 413 | The request is too large: send the registrants in smaller batches |
| 5xx | A temporary problem on our side: retry |
Errors other than 200 come with a JSON body whose message says what went wrong.
Retries and idempotency
Every request is safe to repeat. A registrant is identified by your id: sending it again updates the earlier record, or leaves it unchanged, and never creates a duplicate.
- Retry
5xxresponses, timeouts and network errors with a backoff, for example after 10 s, 1 min, 5 min and 30 min. - Don't retry
400,401,403or413as they are: fix the request first. - We apply registrants in the order they arrive. Send the full current record each time, not only the changed fields, so a late retry can't bring back old data.
- Set your client timeout to 30 seconds.
Limits
| Limit | Value |
|---|---|
| Barcode | 200 characters, unique within the event |
| Name, email | 200 characters |
| Pull interval | 30 seconds by default, 10 seconds at the shortest |
A request is answered when processing ends, typically in under a second. If a request holds more registrants than we process at once, the ingest summary says so in errors: send the rest in a further request.
The registrant object
One person registered for the event. Only id and name are required; send the barcode too, because it is what attendees scan. These are the field names to use if you have no format of your own: with them there is nothing to map.
Attributes
idstringRequired- Your unique, stable id for the person in this event. A record with the same id updates the earlier one.
namestringRequired- Full name, printed on the badge. First and last names in separate fields work too.
barcodestringRecommended- The exact text your QR code contains, character for character. Our kiosk, desk and gate scanners read it. Plain text of letters, digits and
- _ / . :; if your QR holds a URL, send the whole URL. Missing, we useid. categorystringRecommended- Your ticket class or attendee type, as a stable code such as
VIP. We match each code to one of our ticket types, which sets the badge design. Tell us your codes before go-live. statusstring- Lets you cancel a registration. The values that mean cancelled, such as
cancelled, are agreed during setup. A cancelled attendee can't print a badge or enter. emailstring- Contact email.
phonestring- Any format. Saudi numbers are normalised to
+9665…. languagestringaroren; values such asArabicalso work.extra fieldsany- Anything else you want kept or printed on the badge. We agree the field list during setup.
Sending your own format
You don't have to rename anything. Send registrants as your platform stores them, nested and named your way, and we map each of our fields to yours once, during setup.
- Paths reach into nested objects and lists:
{person.contact.mail},{tickets[0].class}. - A field can combine several of yours:
{first_name} {last_name}. - Alternatives take the first with a value:
{mobile|phone}. - The list can sit anywhere in your body, for example under
data.attendees.
To set the mapping up, send us one real record from your platform.
Send registrants
POST/api/integrations/{integration_id}/inbound
Creates or updates registrants. Send one or several per request, whenever they register or change; a nightly full sync is also fine. Returns an ingest summary.
Path parameters
integration_idstringRequired- Your integration's id, sent with your credentials.
Headers
AuthorizationstringRequiredBearerfollowed by your API key.X-Api-Keyworks instead.Content-TypestringRequiredapplication/json
Body
registrant | registrant[] | objectjsonRequired- One registrant, an array of them, or a wrapper object with the list inside, such as
{ "data": { "attendees": [ … ] } }.
Sending webhooks
POST/api/integrations/{integration_id}/inbound
Your platform posts to our endpoint whenever a registrant is created, updated or cancelled. The endpoint and body shapes are those of Send registrants; instead of an API key, each request carries a signature.
Event names don't matter to us: we read the registrant inside each notification, for example under data. Batches of registrants in one notification work too.
We answer 200 once the registrant is stored, within a second or two. Retry anything else, as described in Retries.
Signing requests
Sign every webhook with the signing secret we share with you. The signature is the HMAC-SHA256 of the raw request body, keyed with the secret, in a header:
Headers
X-SignaturestringRequired- The signature as hex or base64. A
sha256=prefix is accepted. If your platform already uses another header name, such asX-Hub-Signature-256, we use yours.
401.Updates and cancellations
To change a registrant, send the full record again with the same id: a new name, category or barcode replaces the old one.
To cancel one, send it with its cancelled status. Send the registrant, not only an id or an event name, so we can match it. Sending it again later with an active status restores it.
A registrant you delete without telling us stays registered with us, and can still print a badge.
How we fetch
If your platform can't call out but already has an API, we call it. Every 30 seconds by default we ask for the registrants changed since our last successful fetch, follow your pagination, and import them as if you had pushed them.
- The time we send is when our previous successful fetch started, minus 5 seconds, in ISO 8601 UTC.
- Without a change filter we fetch the whole list each time, which suits events of up to a few thousand registrants.
- On the event day we can fetch every 10 seconds, if you agree.
Send us your API documentation and a token for a test event to set this up.
Your API requirements
- Reachable over HTTPS on a public address, without redirects to another URL.
- Authentication in request headers, such as
Authorization: Bearer <token>orX-Api-Key. - The event's registrants as JSON, by
GET, orPOSTwith a body we fill in. The list can sit anywhere in the response. - A filter by last change taking an ISO 8601 UTC time, such as
?updated_since=…. Recommended. - Cancelled registrants included in those changes, with their cancelled status. A registrant who disappears from your API stays registered with us.
- Long lists split into pages in one of the styles under Pagination.
- An answer within 20 seconds.
If you restrict access by IP address, ask us for our server's address.
Pagination
We follow your pages until there are no more. Three styles are supported:
| Style | How it works |
|---|---|
| Page number | We send page=1, 2, 3… and optionally a page size; we stop at an empty or short page |
| Cursor | Your response holds the next cursor; we send it back until it is empty |
| Next-page URL | Your response holds the full URL of the next page; we follow it until there is none |
Tell us the parameter names your API uses and where the cursor or next URL sits in the response.
The ingest summary
What we did with the registrants in a request. Returned by Push and Webhook requests with a 200.
Attributes
receivedinteger- Registrants found in the request.
createdinteger- New registrants, now printable at our kiosks.
updatedinteger- Registrants whose details changed.
unchangedinteger- Registrants we already had exactly as sent.
cancelledinteger- Registrants cancelled by this request.
failedinteger- Registrants we couldn't store; see
errors. errorsarray of objects- One entry per failed registrant, up to 50.
Testing checklist
We start on a test event with its own credentials, and switch to the live event once a registrant has gone end to end: from your platform to a printed badge.
What we need from you
- The method you choose: Push, Webhook or Pull
- One real registrant record, or for Pull your API documentation and a test token
- Your category codes, and the status values that mean cancelled
- A sample of what your QR codes contain
- Expected registrations on the event day and the peak per minute, and a contact for that day
Test steps
- Send three registrants, one per category you use. We confirm each arrived as expected.
- Change one registrant's name and send it again: it updates and doesn't duplicate.
- Cancel one: our kiosk then refuses to print their badge.
- Scan one of your QR codes at our kiosk: the badge prints within seconds.
- Register someone new on your platform and time how long they take to reach our kiosk.
