fepli
DevelopersAPI resources

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.

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 applicationQuestions of the offer): each with the question UUID, its label, its type (yn, int, txt, choice or file) and the answer. The answer to a choice is the label of the option.

  • 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 attendance.

  • Name
    transitions
    Type
    string[]
    Description

    The transitions the current state allows. The list doesn't check your permissions, and for waiting attendances 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.

Attendance states

StateMeaning
waitingApplied; no decision yet.
confirmedHas a place.
waitlistedOn the waitlist.
rejectedGot no place.
withdrawnWithdrawn by the family or an admin.
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. 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.


GET/attendances

List 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

    true for paid attendances, false for unpaid ones.

  • Name
    payable
    Type
    boolean
    Description

    true for attendances whose fee is due.

  • Name
    heldBack
    Type
    boolean
    Description

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

  • Name
    modifiedSince
    Type
    timestamp
    Description

    Only attendances changed since this moment.

  • Name
    page, itemsPerPage
    Type
    integer
    Description

    See Pagination.

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

GET/offers/{uuid}/attendances

List 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_lists task is active (see the edition's participantListReleased). If that task is alwaysActive, their access ends once the data retention period after the offer's last date has passed. Otherwise the answer is 403.
  • 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, participated and noshow attendances, and the withdrawn ones that were confirmed before. Where the edition lets hosts assign participants themselves (hostsCanAssign), they also get the waiting and waitlisted ones. 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

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

  • Name
    page, itemsPerPage
    Type
    integer
    Description

    See Pagination.

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

GET/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.

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

POST/attendances

Create 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, waitlisted or waiting, 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. 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.

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


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

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

POST/attendances/{uuid}/transition

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

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

POST/attendances/{uuid}/transfer

Move 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), waitlisted or confirmed. 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 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.

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

DELETE/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.

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

Was this page helpful?