Applications
An application (Anmeldung, an attendance in the API) is a participant's application for an offer. It moves through states, from waiting to confirmed or waitlisted, and on to participated. Each application also knows whether its fee is due and paid.
The application model
- Name
uuid- Type
- string
- Description
The application's identifier.
- Name
status- Type
- string
- Description
The state the application 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 pseudonymised.
- Name
account- Type
- reference
- Description
The family account of the participant, if any.
- Name
createdAt- Type
- timestamp
- Description
When the application was made.
- Name
modifiedAt- Type
- timestamp
- Description
When the application was last changed.
- Name
statusChangedAt- Type
- timestamp
- Description
When the state last changed.
- Name
confirmedAt- Type
- timestamp
- Description
When the application was confirmed.
- Name
paid- Type
- boolean
- Description
Whether the fee has been paid.
- Name
payable- Type
- boolean
- Description
Whether the fee is due. Applications 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 application, 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 application 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 application ended up in its state, if recorded, for example by the lot procedure.
- Name
createdByAdmin- Type
- boolean
- Description
Whether the team entered the application, rather than the family.
- Name
answers- Type
- object[]
- Description
The answers to the offer's application questions: each with the
questionUUID, itslabel, itstype(yn,int,txtorfile) and theanswer.
- 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 application.
- Name
transitions- Type
- string[]
- Description
The transitions the current state allows. The list doesn't check your permissions, and for
waitingapplications 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.
Application states
| State | Meaning |
|---|---|
waiting | Applied; no decision yet. |
confirmed | Has a place. |
waitlisted | On the waiting list. |
rejected | Got no place. |
withdrawn | Withdrawn by the family or the team. |
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. Organiser users may apply the others to applications for their own offers only if the installation lets organisers edit their participant lists, and they can't withdraw.
List all applications
Returns a page of applications, newest first.
Admins see all applications. Organiser users must name an offer with offer, and see its applications only once the edition has released the participant lists. 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 applications for this offer (UUID). The list is then in participant list order.
- Name
participant- Type
- string
- Description
Only applications of this participant (UUID).
- Name
account- Type
- string
- Description
Only applications of this account's participants (UUID or e-mail address).
- Name
edition- Type
- string
- Description
Only applications in this edition (UUID or alias).
- Name
host- Type
- string
- Description
Only applications for offers of this organiser (UUID or alias).
- Name
status- Type
- string
- Description
Only applications in these states, comma-separated. An unknown state is a
400.
- Name
paid- Type
- boolean
- Description
truefor paid applications,falsefor unpaid ones.
- Name
payable- Type
- boolean
- Description
truefor applications whose fee is due.
- Name
heldBack- Type
- boolean
- Description
truefor applications whose decision is held back,falsefor the others.
- Name
modifiedSince- Type
- timestamp
- Description
Only applications changed since this moment.
- Name
page, itemsPerPage- Type
- integer
- Description
See Pagination.
Request
curl -G https://ferienpass-musterstadt.de/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
}
]
List an offer's participants
Returns the participant list of an offer: its applications in list order. The same as GET /attendances?offer={uuid}.
Organiser users can read the list of their own offers once the edition has released the participant lists, and until the data retention period after the offer has ended. Otherwise the answer is 403.
Optional filters
- Name
status- Type
- string
- Description
Only applications in these states, comma-separated.
- Name
heldBack- Type
- boolean
- Description
truefor applications whose decision is held back,falsefor the others.
- Name
page, itemsPerPage- Type
- integer
- Description
See Pagination.
Request
curl "https://ferienpass-musterstadt.de/api/offers/0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03/attendances?status=confirmed,waitlisted" \
-H "Authorization: Bearer $FEPLI_TOKEN"
Retrieve an application
Returns one application.
Request
curl https://ferienpass-musterstadt.de/api/attendances/0192d0e8-3a4b-7c5d-9e6f-7a8b9c0d1e07 \
-H "Authorization: Bearer $FEPLI_TOKEN"
Create an application
Applies a participant for an offer, like Neue Anmeldung in the admin.
Without status, the edition's application procedure decides: first come, first served confirms or waitlists the application straight away; in a lot procedure it waits for the allocation. You can instead set the state directly with status.
If the participant already applied for the offer, that application is reused and allocated again, and returned with 201 like a new one.
Creating applications needs ROLE_ADMIN: the participant is looked up with the rules of the participant endpoints, which organiser 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 application. 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.
Request
curl -X POST https://ferienpass-musterstadt.de/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 application with the state it got.
Update an application
Changes an application's details. The state is changed with a transition instead. Organiser 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 application from the family's open payments. A paid application 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 application. 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.
Request
curl -X PATCH https://ferienpass-musterstadt.de/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 }
}'
Apply a transition
Changes the application's state. The application'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 application 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.
Request
curl -X POST https://ferienpass-musterstadt.de/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"
]
}
Move an application to another offer
Moves a participant to another offer, like Teilnehmende übertragen in the admin. The participant gets a new application for the target offer, in the state you choose, and this application is deleted with its history, answers, uploaded files and comments. Responds with 201 Created and the new application, which has a new uuid.
The money follows the participant: the receipt lines of this application move to the new one, and a paid application stays paid. The amounts are not recalculated. If the two offers have different fees, settle the difference by hand, for example with a booking.
As for any new application, the target offer's participant list is then reordered in the background: if the edition's running application phase is first come, first served, free places there are filled from its waiting list, 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 application. Organiser users may do so only if the installation lets organisers 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 application's own offer, if the participant already has an application for the target offer (even a withdrawn one: change that one with a transition instead), or if the participant was pseudonymised.
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 application:
waiting(the default),waitlistedorconfirmed. It replaces the state of the old application; the target's application procedure 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.
Request
curl -X POST https://ferienpass-musterstadt.de/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"]
}
Delete an application
Deletes an application outright, as if it had never been made. Admins only. Responds with 204 No Content.
If a paid receipt refers to the application, 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.
Request
curl -X DELETE https://ferienpass-musterstadt.de/api/attendances/0192d0e8-3a4b-7c5d-9e6f-7a8b9c0d1e07 \
-H "Authorization: Bearer $FEPLI_TOKEN"