fepli
API resources

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 question UUID, its label, its type (yn, int, txt or file) and the answer.

  • Name
    files
    Type
    object[]
    Description

    Files uploaded as answers: each with uuid, question, name, mimeType and size in 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 waiting applications it also contains await_email and await_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

StateMeaning
waitingApplied; no decision yet.
confirmedHas a place.
waitlistedOn the waiting list.
rejectedGot no place.
withdrawnWithdrawn by the family or the team.
unfulfilledGot no place in the allocation of places.
participatedTook part.
noshowHad a place but didn't turn up.
email_unconfirmedApplied without an account; the e-mail address isn't confirmed yet.
consents_outstandingApplied without an account; waiting for a guardian's consent.

Change the state with POST /attendances/{uuid}/transition:

TransitionFromTo
confirmwaiting, waitlisted, rejected, withdrawn, unfulfilledconfirmed
waitlistwaiting, confirmed, rejected, withdrawn, unfulfilledwaitlisted
rejectany except rejected, participated and noshowrejected
withdrawwaiting, confirmed, waitlisted, rejected, email_unconfirmed, consents_outstandingwithdrawn
resetconfirmed, waitlisted, rejected, withdrawn, unfulfilledwaiting
unfulfillwaiting, confirmed, waitlisted, rejected, withdrawnunfulfilled
participatedconfirmed, waitlisted, rejected, withdrawn, unfulfilledparticipated
noshowconfirmednoshow

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.


GET/attendances

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

    true for paid applications, false for unpaid ones.

  • Name
    payable
    Type
    boolean
    Description

    true for applications whose fee is due.

  • Name
    heldBack
    Type
    boolean
    Description

    true for applications whose decision is held back, false for the others.

  • Name
    modifiedSince
    Type
    timestamp
    Description

    Only applications changed since this moment.

  • Name
    page, itemsPerPage
    Type
    integer
    Description

    See Pagination.

Request

GET·/attendances
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
  }
]

GET/offers/{uuid}/attendances

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

    true for applications whose decision is held back, false for the others.

  • Name
    page, itemsPerPage
    Type
    integer
    Description

    See Pagination.

Request

GET·/offers/{uuid}/attendances
curl "https://ferienpass-musterstadt.de/api/offers/0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03/attendances?status=confirmed,waitlisted" \
  -H "Authorization: Bearer $FEPLI_TOKEN"

GET/attendances/{uuid}

Retrieve an application

Returns one application.

Request

GET·/attendances/{uuid}
curl https://ferienpass-musterstadt.de/api/attendances/0192d0e8-3a4b-7c5d-9e6f-7a8b9c0d1e07 \
  -H "Authorization: Bearer $FEPLI_TOKEN"

POST/attendances

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, waitlisted or waiting, 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. With false, the decision is held back until the edition's decisions are committed; notify then has to be false too.

  • Name
    allAlternateDates
    Type
    boolean
    Description

    Whether the participant can come to every date. Defaults to true.

Request

POST·/attendances
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.


PATCH/attendances/{uuid}

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. false removes 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; null removes an answer.

Request

PATCH·/attendances/{uuid}
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 }
  }'

POST/attendances/{uuid}/transition

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. With false, the decision is held back until the edition's decisions are committed; notify then has to be false too.

Request

POST·/attendances/{uuid}/transition
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"
  ]
}

POST/attendances/{uuid}/transfer

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), waitlisted or confirmed. 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 needs status confirmed (422 otherwise).

  • Name
    commit
    Type
    boolean
    Description

    Record the decision now. Defaults to true. With false, it is held back until the edition's decisions are committed; notify then has to be false too.

Request

POST·/attendances/{uuid}/transfer
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/attendances/{uuid}

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

DELETE·/attendances/{uuid}
curl -X DELETE https://ferienpass-musterstadt.de/api/attendances/0192d0e8-3a4b-7c5d-9e6f-7a8b9c0d1e07 \
  -H "Authorization: Bearer $FEPLI_TOKEN"

Was this page helpful?