API reference
Crew
Crew, volunteers and shifts.
List crew
GET/events/{eventId}/crew
Lists the event's crew and volunteers with their roles and shifts. Names, addresses and phone numbers need people:read.
- Scopes
- crew:read
- Module
crewRefused 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.
limitinteger (int32)How many on a page, up to 500.
Default:
100
Answers
- 200 A page of crew. CrewMemberList
Fields
dataCrewMember[]The items of this page.
Show the fields
crewMemberIdstring (uuid)Their id.
eventIdstring (uuid)The event's id.
namestring or nullTheir name. Null without people:read.
emailstring or nullTheir address. Null without people:read.
phonestring or nullA number to reach them on the day. Null without people:read.
rolesstring[]The roles they may do: door, infoDesk, room and others.
attendeeIdstring (uuid) or nullTheir crew ticket.
hasTicketbooleanWhether their crew ticket works.
shiftIdsstring (uuid)[]The shifts they are on.
invitedUtcstring (date-time)When they were invited, in UTC.
lastSeenUtcstring (date-time) or nullWhen they last opened the crew app, in UTC.
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
nextCursorstring or nullThe cursor for the next page; null on the last page. Pass it as cursor, with the same filters.
hasMorebooleanWhether there is another page.
- 400 invalidCursor.
- 401 invalidKey, keyExpired, keyRevoked.
- 403 missingScope.
- 404 eventNotFound.
- 409 moduleOff.
- 429 rateLimited.
Refusals
invalidKey keyExpired keyRevoked rateLimited missingScope moduleOff eventNotFound invalidCursor
Request
curl "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/crew?limit=2" \
-H "Authorization: Bearer $ATTENDBEACON_KEY"const response = await fetch("https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/crew?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/crew?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/crew", 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/crew?limit=2" -Headers $headers200 Example answer
{
"data": [
{
"crewMemberId": "b3ac0020-0000-4000-8000-000000000000",
"eventId": "b3ac0000-0000-4000-8000-000000000001",
"name": "Femke de Wit",
"email": "femke.dewit@example.com",
"phone": "+31 6 1234 5601",
"roles": [
"greeter",
"infoDesk"
],
"attendeeId": "b3ac001f-0000-4000-8000-000000000000",
"hasTicket": true,
"shiftIds": [
"b3ac0021-0000-4000-8000-000000000002",
"b3ac0021-0000-4000-8000-00000000000a"
],
"invitedUtc": "2026-09-24T21:40:47.963Z",
"lastSeenUtc": "2026-10-13T21:40:47.963Z",
"erased": false,
"personalData": "included"
},
{
"crewMemberId": "b3ac0020-0000-4000-8000-000000000001",
"eventId": "b3ac0000-0000-4000-8000-000000000001",
"name": "Joris van Dam",
"email": "joris.vandam@example.com",
"phone": "+31 6 1234 5602",
"roles": [
"door",
"swag"
],
"attendeeId": "b3ac001f-0000-4000-8000-000000000001",
"hasTicket": true,
"shiftIds": [
"b3ac0021-0000-4000-8000-000000000000",
"b3ac0021-0000-4000-8000-000000000001"
],
"invitedUtc": "2026-09-25T21:40:47.963Z",
"lastSeenUtc": "2026-10-12T20:40:47.963Z",
"erased": false,
"personalData": "included"
}
],
"nextCursor": "YzE6MDYzOTI1OTY5MjQ3OTYzMDAwMHxiM2FjMDAyMDAwMDA0MDAwODAwMDAwMDAwMDAwMDAwMQ",
"hasMore": true
}400 invalidCursor.
{
"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/crew",
"code": "invalidCursor",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",
"error": "Pass nextCursor exactly as a list returned it, with the same filters."
}List shifts
GET/events/{eventId}/shifts
Lists crew and volunteer shifts in time order: where, when, how many are needed and how many are on it.
- Scopes
- crew:read
- Module
crewRefused 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.
limitinteger (int32)How many on a page, up to 500.
Default:
100updatedSincestring (date-time)Only what changed at or after this moment, in UTC unless it says otherwise. Pass the newest updatedUtc your last sync saw.
Answers
- 200 A page of shifts. ShiftList
Fields
dataShift[]The items of this page.
Show the fields
shiftIdstring (uuid)The shift's id.
eventIdstring (uuid)The event's id.
rolestringWhat it is: door, infoDesk, room and others.
placeobjectWhere.
Show the fields
kindstringDoor, room, area or other.
idstring (uuid) or nullThe door or room.
namestring or nullIts name.
startsUtcstring (date-time)When it starts, in UTC.
endsUtcstring (date-time)When it ends, in UTC.
startsLocalstringWhen it starts, in the venue's time.
endsLocalstringWhen it ends, in the venue's time.
timeZonestringThe venue's time zone.
neededinteger (int32)How many it needs.
assignedinteger (int32)How many are on it.
openinteger (int32)Places still open.
crewMemberIdsstring (uuid)[]Who is on it.
updatedUtcstring (date-time) or nullWhen it last changed, in UTC.
nextCursorstring or nullThe cursor for the next page; null on the last page. Pass it as cursor, with the same filters.
hasMorebooleanWhether there is another page.
- 400 invalidCursor, invalidUpdatedSince, invalidRequest.
- 401 invalidKey, keyExpired, keyRevoked.
- 403 missingScope.
- 404 eventNotFound.
- 409 moduleOff.
- 429 rateLimited.
Refusals
invalidKey keyExpired keyRevoked rateLimited missingScope moduleOff eventNotFound invalidCursor invalidUpdatedSince invalidRequest
Request
curl "https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/shifts?limit=2" \
-H "Authorization: Bearer $ATTENDBEACON_KEY"const response = await fetch("https://attendbeacon.com/api/v1/events/b3ac0000-0000-4000-8000-000000000001/shifts?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/shifts?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/shifts", 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/shifts?limit=2" -Headers $headers200 Example answer
{
"data": [
{
"shiftId": "b3ac6705-0000-4000-8000-000000000000",
"eventId": "b3ac0000-0000-4000-8000-000000000001",
"role": "infoDesk",
"place": {
"kind": "area",
"id": null,
"name": "Registration desk"
},
"startsUtc": "2026-11-12T06:30:00.000Z",
"endsUtc": "2026-11-12T09:00:00.000Z",
"startsLocal": "2026-11-12T07:30",
"endsLocal": "2026-11-12T10:00",
"timeZone": "Europe/Amsterdam",
"needed": 3,
"assigned": 2,
"open": 1,
"crewMemberIds": [
"b3ac6703-0000-4000-8000-000000000000",
"b3ac6703-0000-4000-8000-000000000001"
],
"updatedUtc": "2026-10-06T21:40:47.963Z"
},
{
"shiftId": "b3ac0021-0000-4000-8000-000000000000",
"eventId": "b3ac0000-0000-4000-8000-000000000001",
"role": "door",
"place": {
"kind": "door",
"id": "b3ac0010-0000-4000-8000-000000000000",
"name": null
},
"startsUtc": "2026-11-12T07:00:00.000Z",
"endsUtc": "2026-11-12T10:00:00.000Z",
"startsLocal": "2026-11-12T08:00",
"endsLocal": "2026-11-12T11:00",
"timeZone": "Europe/Amsterdam",
"needed": 2,
"assigned": 2,
"open": 0,
"crewMemberIds": [
"b3ac0020-0000-4000-8000-000000000001",
"b3ac0020-0000-4000-8000-000000000005"
],
"updatedUtc": "2026-10-14T21:40:49.222Z"
}
],
"nextCursor": "YzE6MDYzOTMwMDYzNjAwMDAwMDAwMHxiM2FjMDAyMTAwMDA0MDAwODAwMDAwMDAwMDAwMDAwMA",
"hasMore": true
}400 invalidCursor, invalidUpdatedSince, invalidRequest.
{
"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/shifts",
"code": "invalidCursor",
"traceId": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01",
"error": "Pass nextCursor exactly as a list returned it, with the same filters."
}The guides and this site are in your language. The API reference's own descriptions are in English, as the API itself speaks.