Attendances
An attendance records that a participant applied for an offer. It moves through states, from waiting to confirmed or waitlisted, and on to participated. Each attendance also knows whether its fee is due and paid.
- GET
/attendancesList all attendances - GET
/offers/{uuid}/attendancesList an offer's participants - GET
/attendances/{uuid}Retrieve an attendance - POST
/attendancesCreate an attendance - PATCH
/attendances/{uuid}Update an attendance - POST
/attendances/{uuid}/transitionApply a transition - POST
/attendances/{uuid}/transferMove an attendance to another offer - DELETE
/attendances/{uuid}Delete an attendance
The attendance model
- Name
uuid- Type
- string
- Description
The attendance's identifier.
- Name
status- Type
- string
- Description
The state the attendance is in.
- Name
offer- Type
- reference
- Description
The offer applied for.
- Name
edition- Type
- reference
- Description
The edition of the offer.
- Name
participant- Type
- reference
- Description
The participant who applied. Missing once the participant was deleted.
- Name
account- Type
- reference
- Description
The account of the participant, if any.
- Name
createdAt- Type
- timestamp
- Description
When the attendance was created.
- Name
modifiedAt- Type
- timestamp
- Description
When the attendance was last changed.
- Name
statusChangedAt- Type
- timestamp
- Description
When the state last changed.
- Name
confirmedAt- Type
- timestamp
- Description
When the attendance was confirmed.
- Name
paid- Type
- boolean
- Description
Whether the fee has been paid.
- Name
payable- Type
- boolean
- Description
Whether the fee is due. Attendances that are due and unpaid are the family's open payments.
- Name
fee- Type
- integer
- Description
The fee this participant pays for this offer, in cents. It can differ from the offer's
fee, for example with a discount.
- Name
sorting- Type
- integer
- Description
The position on the offer's participant list.
- Name
userPriority- Type
- integer
- Description
The priority the family gave this attendance, for editions that allocate places by lot.
- Name
allAlternateDates- Type
- boolean
- Description
Whether the participant can come to every date of the offer.
- Name
consentOutstanding- Type
- boolean
- Description
Whether a required consent is still missing.
- Name
heldBack- Type
- boolean
- Description
Whether the decision on this attendance is held back: it was made by the lot or with
commit: false, and waits until the edition's decisions are committed. Until then its fee is not due, and the family hasn't been told.
- Name
decisionReason- Type
- string
- Description
Why the attendance ended up in its state, if recorded, for example by the lot procedure.
- Name
createdByAdmin- Type
- boolean
- Description
Whether the team entered the attendance rather than the family: a colleague or a service account.
- Name
answers- Type
- object[]
- Description
The answers to the offer's application questions, those of the edition first (see
applicationQuestionsof the offer): each with thequestionUUID, itslabel, itstype(yn,int,txt,choiceorfile) and theanswer. The answer to achoiceis the label of the option.
- Name
files- Type
- object[]
- Description
Files uploaded as answers: each with
uuid,question,name,mimeTypeandsizein bytes.
- Name
receipts- Type
- string[]
- Description
The UUIDs of the paid receipts that cover this attendance.
- Name
transitions- Type
- string[]
- Description
The transitions the current state allows. The list doesn't check your permissions, and for
waitingattendances it also containsawait_emailandawait_consents, which are applied by the system and can't be sent through the API.
- Name
piiMasked- Type
- boolean
- Description
Whether the participant's or account's name was left out because you may not see it.
Attendance states
| State | Meaning |
|---|---|
waiting | Applied; no decision yet. |
confirmed | Has a place. |
waitlisted | On the waitlist. |
rejected | Got no place. |
withdrawn | Withdrawn by the family or an admin. |
unfulfilled | Got no place in the allocation of places. |
participated | Took part. |
noshow | Had a place but didn't turn up. |
email_unconfirmed | Applied without an account; the e-mail address isn't confirmed yet. |
consents_outstanding | Applied without an account; waiting for a guardian's consent. |
Change the state with POST /attendances/{uuid}/transition:
| Transition | From | To |
|---|---|---|
confirm | waiting, waitlisted, rejected, withdrawn, unfulfilled | confirmed |
waitlist | waiting, confirmed, rejected, withdrawn, unfulfilled | waitlisted |
reject | any except rejected, participated and noshow | rejected |
withdraw | waiting, confirmed, waitlisted, rejected, email_unconfirmed, consents_outstanding | withdrawn |
reset | confirmed, waitlisted, rejected, withdrawn, unfulfilled | waiting |
unfulfill | waiting, confirmed, waitlisted, rejected, withdrawn | unfulfilled |
participated | confirmed, waitlisted, rejected, withdrawn, unfulfilled | participated |
noshow | confirmed | noshow |
Admins may apply every transition. Host users may apply the others to attendances for their own offers only if the installation lets host users edit their participant lists, and they can't withdraw.
/attendancesList all attendances
Returns a page of attendances, newest first.
Admins see all attendances. Host users must name an offer with offer, and see its attendances by the rules of its participant list. Without offer they get a 400. An offer that belongs to no edition has no participant list: naming it is a 403, for admins too.
Optional filters
- Name
offer- Type
- string
- Description
Only attendances for this offer (UUID). The list is then in participant list order.
- Name
participant- Type
- string
- Description
Only attendances of this participant (UUID).
- Name
account- Type
- string
- Description
Only attendances of this account's participants (UUID, or e-mail address within your own tenant).
- Name
edition- Type
- string
- Description
Only attendances in this edition (UUID or alias).
- Name
host- Type
- string
- Description
Only attendances for offers of this host (UUID or alias).
- Name
status- Type
- string
- Description
Only attendances in these states, comma-separated. An unknown state is a
400.
- Name
paid- Type
- boolean
- Description
truefor paid attendances,falsefor unpaid ones.
- Name
payable- Type
- boolean
- Description
truefor attendances whose fee is due.
- Name
heldBack- Type
- boolean
- Description
truefor attendances whose decision is held back,falsefor the others.
- Name
modifiedSince- Type
- timestamp
- Description
Only attendances changed since this moment.
- Name
page, itemsPerPage- Type
- integer
- Description
See Pagination.
curl -G https://example.fepli.eu/api/attendances \
-H "Authorization: Bearer $FEPLI_TOKEN" \
--data-urlencode "account=familie.mueller@example.org" \
-d edition=herbstferien-2026
Response
[
{
"uuid": "0192d0e8-3a4b-7c5d-9e6f-7a8b9c0d1e07",
"status": "confirmed",
"offer": {
"uuid": "0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03",
"name": "Fahrradtour durch den Stadtpark",
"alias": "fahrradtour-durch-den-stadtpark"
},
"edition": {
"uuid": "01913e5c-2b4a-7d10-9f3e-6a1c2e7b4d01",
"name": "Herbstferien 2026",
"alias": "herbstferien-2026"
},
"participant": {
"uuid": "0191c7b3-1f2a-7c4d-8e5f-6a7b8c9d0e06",
"name": "Lena Müller"
},
"account": {
"uuid": "0191c7b2-4d5e-7f60-8a1b-2c3d4e5f6a05",
"name": "Anna Müller"
},
"createdAt": "2026-09-01T08:03:12+02:00",
"modifiedAt": "2026-09-01T08:03:13+02:00",
"statusChangedAt": "2026-09-01T08:03:13+02:00",
"confirmedAt": "2026-09-01T08:03:13+02:00",
"paid": false,
"payable": true,
"fee": 750,
"sorting": 4,
"userPriority": 1,
"allAlternateDates": true,
"consentOutstanding": false,
"createdByAdmin": false,
"answers": [
{
"question": "0192a4f4-1b2c-7d3e-8f4a-5b6c7d8e9f13",
"label": "Kann Ihr Kind sicher Fahrrad fahren?",
"type": "yn",
"answer": true
}
],
"files": [],
"receipts": [],
"transitions": [
"waitlist",
"withdraw",
"reset",
"reject",
"unfulfill",
"noshow",
"participated"
],
"piiMasked": false
}
]
/offers/{uuid}/attendancesList an offer's participants
Returns the participant list of an offer: its attendances in list order. The same as GET /attendances?offer={uuid}.
Host users read the list as the admin shows it to them:
- They can read the list of their own offers while the edition's
publish_liststask is active (see the edition'sparticipantListReleased). If that task isalwaysActive, their access ends once the data retention period after the offer's last date has passed. Otherwise the answer is403. - Where the edition asks hosts to sign a confidentiality declaration, they read no list before they signed it. Until then the answer is
403, with a message that names the edition. - They get the
confirmed,participatedandnoshowattendances, and thewithdrawnones that were confirmed before. Where the edition lets hosts assign participants themselves (hostsCanAssign), they also get thewaitingandwaitlistedones. If the installation lets host users edit their participant lists, they get every attendance of the offer.
Optional filters
The filters of /attendances apply, except offer: participant, account, edition, host, status, paid, payable, heldBack and modifiedSince.
- Name
status- Type
- string
- Description
Only attendances in these states, comma-separated.
- Name
heldBack- Type
- boolean
- Description
truefor attendances whose decision is held back,falsefor the others.
- Name
page, itemsPerPage- Type
- integer
- Description
See Pagination.
curl "https://example.fepli.eu/api/offers/0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03/attendances?status=confirmed,waitlisted" \
-H "Authorization: Bearer $FEPLI_TOKEN"
/attendances/{uuid}Retrieve an attendance
Returns one attendance.
Host users get the attendances their participant list shows them. Any other attendance is a 404. Before they signed an edition's confidentiality declaration, an attendance of that edition is a 403. The same holds when they change an attendance, apply a transition, move it to another offer or read and write its comments.
curl https://example.fepli.eu/api/attendances/0192d0e8-3a4b-7c5d-9e6f-7a8b9c0d1e07 \
-H "Authorization: Bearer $FEPLI_TOKEN"
/attendancesCreate an attendance
Applies a participant for an offer, like Neue Anmeldung in the admin.
Without status, the application system of the edition's active application_system task decides: firstcome confirms or waitlists the attendance straight away; with lot it waits for the allocation. You can instead set the state directly with status.
If the participant already applied for the offer, that attendance is reused and allocated again, and returned with 201 like a new one.
Creating attendances needs ROLE_ADMIN: the participant is looked up with the rules of the participant endpoints, which host users don't pass.
Required attributes
- Name
offer- Type
- string
- Description
The offer (UUID).
- Name
participant- Type
- string
- Description
The participant (UUID).
Optional attributes
- Name
status- Type
- string
- Description
confirmed,waitlistedorwaiting, to set the state directly.
- Name
notify- Type
- boolean
- Description
Send the family the usual e-mail about the attendance. Defaults to
false.
- Name
commit- Type
- boolean
- Description
Record the decision now. Defaults to
true. Withfalse, the decision is held back until the edition's decisions are committed;notifythen has to befalsetoo.
- Name
allAlternateDates- Type
- boolean
- Description
Whether the participant can come to every date. Defaults to
true.
curl -X POST https://example.fepli.eu/api/attendances \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"offer": "0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03",
"participant": "0191c7b3-2e3f-7a4b-9c5d-6e7f8a9b0c16",
"notify": true
}'
The response (201 Created) holds the new attendance with the state it got.
/attendances/{uuid}Update an attendance
Changes an attendance's details. The state is changed with a transition instead. Host users can do this only if the installation lets them edit their participant lists.
Optional attributes
- Name
payable- Type
- boolean
- Description
Whether the fee is due.
falseremoves the attendance from the family's open payments. A paid attendance can't be made non-payable (409); reverse its receipt instead.
- Name
allAlternateDates- Type
- boolean
- Description
Whether the participant can come to every date.
- Name
userPriority- Type
- integer
- Description
The family's priority for this attendance. Negative values become
0.
- Name
answers- Type
- object
- Description
Answers to the application questions, keyed by question UUID. Values are strings, booleans or whole numbers;
nullremoves an answer.
curl -X PATCH https://example.fepli.eu/api/attendances/0192d0e8-3a4b-7c5d-9e6f-7a8b9c0d1e07 \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"answers": { "0192a4f4-1b2c-7d3e-8f4a-5b6c7d8e9f13": false }
}'
/attendances/{uuid}/transitionApply a transition
Changes the attendance's state. The attendance's transitions list the ones its state allows. One that isn't possible from the current state is a 409 that names the possible ones; one you lack the permission for is a 403.
A transition has the same effects as in the admin: withdrawing a confirmed attendance frees the place, and the participant list is reordered.
Required attributes
- Name
transition- Type
- string
- Description
One of
confirm,waitlist,reject,withdraw,reset,unfulfill,participated,noshow.
Optional attributes
- Name
notify- Type
- boolean
- Description
Send the family the usual e-mail about the change. Defaults to
false.
- Name
commit- Type
- boolean
- Description
Record the decision now. Defaults to
true. Withfalse, the decision is held back until the edition's decisions are committed;notifythen has to befalsetoo.
curl -X POST https://example.fepli.eu/api/attendances/0192d0e8-3a4b-7c5d-9e6f-7a8b9c0d1e07/transition \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"transition": "withdraw", "notify": true}'
Response (excerpt)
{
"uuid": "0192d0e8-3a4b-7c5d-9e6f-7a8b9c0d1e07",
"status": "withdrawn",
"…": "…",
"transitions": [
"confirm",
"waitlist",
"reset",
"reject",
"unfulfill",
"participated"
]
}
/attendances/{uuid}/transferMove an attendance to another offer
Moves a participant to another offer, like Teilnehmer:innen übertragen in the admin. The participant gets a new attendance for the target offer, in the state you choose, and this attendance is deleted with its history, answers, uploaded files and comments. Responds with 201 Created and the new attendance, which has a new uuid.
The money follows the participant: the receipt lines of this attendance move to the new one, and a paid attendance stays paid. The amounts are not recalculated. If the two offers have different fees, settle the difference by hand, for example with a book entry.
As for any new attendance, the target offer's participant list is then reordered in the background: if the edition's active application_system task uses firstcome, free places there are filled from its waitlist, and those families are e-mailed. The place that becomes free in this offer is not refilled; call POST /offers/{uuid}/refill for that.
Admins may move any attendance. Host users may do so only if the installation lets host users transfer participants and they can see this offer's participant list; otherwise the answer is 403. A target offer you can't see is a 404.
The move is refused with 409 if the target is the attendance's own offer, if the participant already has an attendance for the target offer (even a withdrawn one: change that one with a transition instead), or if the participant was deleted.
Required attributes
- Name
offer- Type
- string
- Description
The offer to move the participant to (UUID).
Optional attributes
- Name
status- Type
- string
- Description
The state of the new attendance:
waiting(the default),waitlistedorconfirmed. It replaces the state of the old attendance; the target's application system doesn't decide.
- Name
notify- Type
- boolean
- Description
E-mail the family the confirmation. Defaults to
false. Only a confirmation is sent, so this needsstatusconfirmed(422otherwise).
- Name
commit- Type
- boolean
- Description
Record the decision now. Defaults to
true. Withfalse, it is held back until the edition's decisions are committed;notifythen has to befalsetoo.
curl -X POST https://example.fepli.eu/api/attendances/0192d0e8-3a4b-7c5d-9e6f-7a8b9c0d1e07/transfer \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"offer": "0192b7c4-8d9e-7f10-a2b3-4c5d6e7f8a19",
"status": "confirmed",
"notify": true
}'
Response (201 Created, excerpt)
{
"uuid": "019a3c05-6e7f-7a80-9b1c-2d3e4f5a6b24",
"status": "confirmed",
"offer": {
"uuid": "0192b7c4-8d9e-7f10-a2b3-4c5d6e7f8a19",
"name": "Fahrradtour durch den Stadtpark II",
"alias": "fahrradtour-durch-den-stadtpark-ii"
},
"participant": {
"uuid": "0191c7b3-1f2a-7c4d-8e5f-6a7b8c9d0e06",
"name": "Lena Müller"
},
"paid": true,
"…": "…",
"receipts": ["0192e1a7-4b5c-7d6e-8f7a-9b0c1d2e3f25"]
}
/attendances/{uuid}Delete an attendance
Deletes an attendance outright, as if it had never been made. Admins only. Responds with 204 No Content.
If a paid receipt refers to the attendance, it can't be deleted (409). Withdraw it instead, or reverse the receipt first. In most cases withdrawing is the better choice anyway: it keeps the history.
curl -X DELETE https://example.fepli.eu/api/attendances/0192d0e8-3a4b-7c5d-9e6f-7a8b9c0d1e07 \
-H "Authorization: Bearer $FEPLI_TOKEN"