API reference
Check-in
Doors, door scans and checking people in.
List doors
GET/events/{eventId}/doors
Lists the doors of an event where people are checked in: the main entrance, session doors and areas.
- Scopes
- events:read
- Module
checkinRefused with moduleOff while the event's organiser has it switched off.
Parameters
path
eventIdstring (uuid)requiredThe event's id.
Answers
- 200 The doors. DoorList
Fields
dataDoor[]The doors.
Show the fields
doorIdstring (uuid)The door's id.
namestringWhat the steward sees.
kindstringEntrance, session or area.
One of:
entrance,session,areasessionIdstring (uuid)The session the door belongs to.
capacityintegerHow many may be inside at once, when limited.
- 401 invalidKey, keyExpired, keyRevoked.
- 403 missingScope.
- 404 eventNotFound.
- 409 moduleOff.
- 429 rateLimited.
Refusals
invalidKey keyExpired keyRevoked rateLimited missingScope moduleOff eventNotFound
Request
curl "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/doors" \
-H "Authorization: Bearer $ATTENDBEACON_KEY"const response = await fetch("https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/doors", {
headers: {
Authorization: `Bearer ${process.env.ATTENDBEACON_KEY}`
}
});
if (!response.ok) throw new Error((await response.json()).detail);
const data = await response.json();using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("ATTENDBEACON_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Get, "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/doors");
using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();import os
import requests
response = requests.get(
"https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/doors",
headers={
"Authorization": f"Bearer {os.environ['ATTENDBEACON_KEY']}"
}
)
response.raise_for_status()
data = response.json()$headers = @{
Authorization = "Bearer $env:ATTENDBEACON_KEY"
}
$data = Invoke-RestMethod -Method Get -Uri "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/doors" -Headers $headers200 Example answer
{
"data": [
{
"doorId": "b3ac0010-0000-4000-8000-000000000000",
"name": "Main entrance",
"kind": "entrance",
"sessionId": null,
"capacity": null
},
{
"doorId": "b3ac0010-0000-4000-8000-000000000001",
"name": "Workshop Lab: threat modelling",
"kind": "session",
"sessionId": "b3ac0004-0000-4000-8000-00000000000c",
"capacity": 30
}
]
}401 invalidKey, keyExpired, keyRevoked.
{
"type": "https://attendbeacon.com/developers/errors#invalidKey",
"title": "No working API key",
"status": 401,
"detail": "No key was sent, or it is not one this platform made. Send it as Authorization: Bearer abk_... or in X-Api-Key.",
"instance": "/api/v1/events/b3ac0000-0000-4000-8000-000000000001/doors",
"code": "invalidKey",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",
"error": "No key was sent, or it is not one this platform made. Send it as Authorization: Bearer abk_... or in X-Api-Key."
}List door scans
GET/events/{eventId}/check-ins
Lists scans that let somebody in or out at any door of the event, oldest first after a given one, or the latest arrivals with sort=-created.
- Scopes
- checkins:read
- Module
checkinRefused with moduleOff while the event's organiser has it switched off.
Parameters
path
eventIdstring (uuid)requiredThe event's id.
query
cursorstringWhere the page starts: nextCursor from the page before, exactly as it was returned. Leave out for the first page.
afterinteger (int64)The last check-in ID you have, or 0 for the start. Kept from before cursors.
Default:
0pageSizeinteger (int32)How many on a page, up to 500. The same as limit.
Default:
100sortstringThe order of the list: changed for the oldest change first (the default, for a sync), or -created for the newest first.
One of:
changed,-createdDefault:
"changed"limitinteger (int32)How many on a page, up to 500.
Default:
100
Answers
- 200 Scans, and the cursor to pass next time. CheckInPage
Fields
dataCheckIn[]The scans.
Show the fields
checkInIdinteger (int64)The scan's id, which only grows.
eventIdstring (uuid)The event's id.
attendeeIdstring (uuid)The attendee's id.
checkInListIdstring (uuid)The door's id.
listNamestringThe door's name.
listKindstringEntrance, session or area.
One of:
entrance,session,areasessionIdstring (uuid)The session the door belongs to.
directionstringIn or out.
One of:
in,outresultstringWelcome (first time), again, or out.
One of:
welcome,again,outscannedUtcstring (date-time)When, in UTC.
offlinebooleanWhether the scanner was offline.
afterinteger (int64)Pass this as after next time.
hasMorebooleanWhether there are more after these.
nextCursorstring or nullThe cursor for the next page, or null on the last. Pass it as cursor; it pages without counting, unlike page.
- 400 invalidCursor, invalidSort.
- 401 invalidKey, keyExpired, keyRevoked.
- 403 missingScope.
- 404 eventNotFound.
- 409 moduleOff.
- 429 rateLimited.
Refusals
invalidKey keyExpired keyRevoked rateLimited missingScope moduleOff eventNotFound invalidCursor invalidSort
Request
curl "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins?limit=2" \
-H "Authorization: Bearer $ATTENDBEACON_KEY"const response = await fetch("https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins?limit=2", {
headers: {
Authorization: `Bearer ${process.env.ATTENDBEACON_KEY}`
}
});
if (!response.ok) throw new Error((await response.json()).detail);
const data = await response.json();using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("ATTENDBEACON_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Get, "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins?limit=2");
using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();import os
import requests
response = requests.get(
"https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins", params={"limit": 2},
headers={
"Authorization": f"Bearer {os.environ['ATTENDBEACON_KEY']}"
}
)
response.raise_for_status()
data = response.json()$headers = @{
Authorization = "Bearer $env:ATTENDBEACON_KEY"
}
$data = Invoke-RestMethod -Method Get -Uri "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins?limit=2" -Headers $headers200 Example answer
{
"data": [],
"after": 0,
"hasMore": false,
"nextCursor": null
}400 invalidCursor, invalidSort.
{
"type": "https://attendbeacon.com/developers/errors#invalidCursor",
"title": "The cursor is not valid",
"status": 400,
"detail": "Pass nextCursor exactly as a list returned it, with the same filters.",
"instance": "/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins",
"code": "invalidCursor",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",
"error": "Pass nextCursor exactly as a list returned it, with the same filters."
}Get door counts
GET/events/{eventId}/check-ins/summary
Gets how the doors stand right now: checked in against registered, the last hour's arrivals and each door's counts.
- Scopes
- checkins:read
- Module
checkinRefused with moduleOff while the event's organiser has it switched off.
Parameters
path
eventIdstring (uuid)requiredThe event's id.
Answers
- 200 The counts. CheckInSummary
Fields
eventIdstring (uuid)The event's id.
registeredinteger (int32)Valid tickets, crew left out.
checkedIninteger (int32)Of whom checked in at the main entrance.
notYetinteger (int32)Registered and not checked in yet.
ratenumber or nullChecked in as a percentage of registered.
lastHourinteger (int32)Let in at an entrance in the last hour.
doorsobject[]Each door.
Show the fields
doorIdstring (uuid)The door's id.
namestringIts name.
kindstringEntrance, session or area.
sessionIdstring (uuid) or nullThe session the door belongs to.
capacityinteger (int32) or nullIts capacity.
admittedinteger (int32)People let in, each once.
insideinteger (int32)In and not out again.
lastHourinteger (int32)Let in in the last hour.
refusedinteger (int32)Scans refused.
atUtcstring (date-time)When this was counted, in UTC.
- 401 invalidKey, keyExpired, keyRevoked.
- 403 missingScope.
- 404 eventNotFound.
- 409 moduleOff, onlineEvent.
- 429 rateLimited.
Refusals
invalidKey keyExpired keyRevoked rateLimited missingScope moduleOff eventNotFound onlineEvent
Request
curl "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins/summary" \
-H "Authorization: Bearer $ATTENDBEACON_KEY"const response = await fetch("https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins/summary", {
headers: {
Authorization: `Bearer ${process.env.ATTENDBEACON_KEY}`
}
});
if (!response.ok) throw new Error((await response.json()).detail);
const data = await response.json();using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("ATTENDBEACON_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Get, "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins/summary");
using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();import os
import requests
response = requests.get(
"https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins/summary",
headers={
"Authorization": f"Bearer {os.environ['ATTENDBEACON_KEY']}"
}
)
response.raise_for_status()
data = response.json()$headers = @{
Authorization = "Bearer $env:ATTENDBEACON_KEY"
}
$data = Invoke-RestMethod -Method Get -Uri "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins/summary" -Headers $headers200 Example answer
{
"eventId": "b3ac0000-0000-4000-8000-000000000001",
"registered": 74,
"checkedIn": 0,
"notYet": 74,
"rate": 0,
"lastHour": 0,
"doors": [
{
"doorId": "b3ac0010-0000-4000-8000-000000000000",
"name": "Main entrance",
"kind": "entrance",
"sessionId": null,
"capacity": null,
"admitted": 0,
"inside": 0,
"lastHour": 0,
"refused": 0
},
{
"doorId": "b3ac0010-0000-4000-8000-000000000001",
"name": "Workshop Lab: threat modelling",
"kind": "session",
"sessionId": "b3ac0004-0000-4000-8000-00000000000c",
"capacity": 30,
"admitted": 0,
"inside": 0,
"lastHour": 0,
"refused": 0
}
],
"atUtc": "2026-10-14T21:47:33.737Z"
}401 invalidKey, keyExpired, keyRevoked.
{
"type": "https://attendbeacon.com/developers/errors#invalidKey",
"title": "No working API key",
"status": 401,
"detail": "No key was sent, or it is not one this platform made. Send it as Authorization: Bearer abk_... or in X-Api-Key.",
"instance": "/api/v1/events/b3ac0000-0000-4000-8000-000000000001/check-ins/summary",
"code": "invalidKey",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",
"error": "No key was sent, or it is not one this platform made. Send it as Authorization: Bearer abk_... or in X-Api-Key."
}Check in an attendee Changes data
POST/events/{eventId}/attendees/{attendeeId}/check-in
Checks an attendee in at the main entrance or at another door, by the same rules as a steward's scanner: a cancelled or unpaid ticket, a full room or a ticket type the door does not admit is refused, and result says so.
- Scopes
- checkins:write
- Module
checkinRefused with moduleOff while the event's organiser has it switched off.
- Send an Idempotency-Key to make retries safe. →
Parameters
path
eventIdstring (uuid)requiredThe event's id.
attendeeIdstring (uuid)requiredThe attendee's id.
header
Idempotency-KeystringA key of your own, such as a UUID, so a retry after a lost connection is answered with the first answer instead of doing it twice. Kept 24 hours.
Body CheckInRequest
The door, when it is not the main entrance.
doorIdstring (uuid)The door, when it is not the main entrance.
Answers
- 200 What the door decided. CheckInResult
Fields
resultstringWelcome (in for the first time), again, or why not: cancelled, unpaid, notOnList, noAddOn, full or noReentry.
admittedbooleanWhether the attendee was let in.
firstCheckInUtcstring (date-time)When they were first checked in at the main entrance, in UTC.
doorobjectThe door.
Show the fields
doorIdstring (uuid)The door's id.
namestringThe door's name.
kindstringEntrance, session or area.
attendeeAttendeeSomebody holding a ticket, or who held one.
Show the fields
attendeeIdstring (uuid)The attendee's id.
eventIdstring (uuid)The event's id.
orderIdstring (uuid)The order's id.
orderReferencestringThe order's six-character reference.
ticketTypeIdstring (uuid)The ticket type's id.
ticketTypeNamestringThe ticket type's name.
firstNamestring or nullFirst name. Null without people:read, or when erased.
lastNamestring or nullLast name. Null without people:read, or when erased.
emailstring (email) or nullEmail address. Null without people:read, or when erased.
companystring or nullCompany. Null without people:read, or when erased.
jobTitlestring or nullJob title. Null without people:read, or when erased.
languagestringThe language they registered in.
answersobject or nullAnswers to the event's registration questions, by question id. Null without people:read, or when erased.
statusstringActive, or cancelled.
One of:
active,cancelledorderStatusstringThe order's status.
One of:
pending,paid,free,onAccount,transfer,requested,declined,cancelled,expired,refundedvalidbooleanWhether the ticket lets them in: not cancelled, and the order paid or free.
checkedInUtcstring (date-time) or nullWhen they were first checked in, in UTC.
createdUtcstring (date-time)When they registered, in UTC.
changedUtcstring (date-time) or nullWhen anything about the attendee or their order last changed. Pass the latest you have as updatedSince.
updatedUtcstring (date-time) or nullWhen anything about the attendee or their order last changed, in UTC: the same as changedUtc.
erasedbooleanWhether the person deleted their data from the event app; then nothing personal is returned, whatever the key may read.
personalDatastringWhether the personal fields are here: included, withheld (the key lacks people:read) or erased (the person deleted their data).
One of:
included,withheld,erased
- 400 invalidIdempotencyKey.
- 401 invalidKey, keyExpired, keyRevoked.
- 403 missingScope, demoWorkspace.
- 404 eventNotFound, attendeeNotFound, noDoor.
- 409 moduleOff, onlineEvent, idempotencyKeyInUse.
- 422 idempotencyKeyReused.
- 429 rateLimited.
Refusals
invalidKey keyExpired keyRevoked rateLimited missingScope moduleOff eventNotFound attendeeNotFound noDoor onlineEvent demoWorkspace idempotencyKeyInUse idempotencyKeyReused invalidIdempotencyKey
Request
curl -X POST "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/attendees/b3ac0008-0000-4000-8000-000000000000/check-in" \
-H "Authorization: Bearer $ATTENDBEACON_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"doorId": "b3ac0010-0000-4000-8000-000000000000"
}'const response = await fetch("https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/attendees/b3ac0008-0000-4000-8000-000000000000/check-in", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ATTENDBEACON_KEY}`,
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json"
},
body: JSON.stringify({
"doorId": "b3ac0010-0000-4000-8000-000000000000"
})
});
if (!response.ok) throw new Error((await response.json()).detail);
const data = await response.json();using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("ATTENDBEACON_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Post, "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/attendees/b3ac0008-0000-4000-8000-000000000000/check-in");
request.Headers.Add("Idempotency-Key", Guid.NewGuid().ToString());
request.Content = new StringContent("""
{
"doorId": "b3ac0010-0000-4000-8000-000000000000"
}
""", Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();import os, uuid
import requests
response = requests.post(
"https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/attendees/b3ac0008-0000-4000-8000-000000000000/check-in",
headers={
"Authorization": f"Bearer {os.environ['ATTENDBEACON_KEY']}",
"Idempotency-Key": str(uuid.uuid4())
},
json={
"doorId": "b3ac0010-0000-4000-8000-000000000000"
}
)
response.raise_for_status()
data = response.json()$headers = @{
Authorization = "Bearer $env:ATTENDBEACON_KEY"
"Idempotency-Key" = [guid]::NewGuid().ToString()
}
$body = @'
{
"doorId": "b3ac0010-0000-4000-8000-000000000000"
}
'@
$data = Invoke-RestMethod -Method Post -Uri "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/attendees/b3ac0008-0000-4000-8000-000000000000/check-in" -Headers $headers -ContentType "application/json" -Body $body400 invalidIdempotencyKey.
{
"type": "https://attendbeacon.com/developers/errors#invalidIdempotencyKey",
"title": "Idempotency-Key is not valid",
"status": 400,
"detail": "An Idempotency-Key is 1 to 255 visible ASCII characters; a UUID is a good one.",
"instance": "/api/v1/events/b3ac0000-0000-4000-8000-000000000001/attendees/{attendeeId}/check-in",
"code": "invalidIdempotencyKey",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",
"error": "An Idempotency-Key is 1 to 255 visible ASCII characters; a UUID is a good one."
}The guides and this site are in your language. The API reference's own descriptions are in English, as the API itself speaks.