Invitations
An invitation asks someone by e-mail to join an organiser's team, or to register a new organiser. The e-mail carries a personal link; following it, the person creates their access. The API sends, lists, resends and withdraws invitations the way the admin does with Einladen on an organiser's team page and Veranstaltende einladen on the organisers list.
Admins see every invitation. Organiser users see the invitations into the organisers they belong to, and can send, resend and withdraw those. Invitations to register a new organiser are for admins only.
To put an account that already exists into a team straight away, without an e-mail, an admin uses Add a team member instead.
The invitation model
- Name
uuid- Type
- string
- Description
The invitation's identifier.
- Name
email- Type
- string
- Description
The invited address, in lower case.
- Name
host- Type
- reference
- Description
The organiser whose team the person joins.
nullfor an invitation to register a new organiser.
- Name
invitedBy- Type
- reference
- Description
The account that sent the invitation.
nullif a service account sent it or the account was deleted since.
- Name
status- Type
- string
- Description
open(sent, not yet answered, still valid),acceptedorexpired.
- Name
createdAt- Type
- timestamp
- Description
When the invitation was first sent.
- Name
expiresAt- Type
- timestamp
- Description
When the link stops working. How long an invitation stays valid is set per installation, 14 days unless configured otherwise. Sending the invitation again pushes this out.
- Name
acceptedAt- Type
- timestamp
- Description
When the person followed the link and joined.
List all invitations
Returns a page of invitations, newest first, whatever their status. The admin shows only the open ones; filter with status=open for the same list.
Optional filters
- Name
host- Type
- string
- Description
Only invitations into this organiser's team (UUID or alias).
- Name
status- Type
- string
- Description
Only invitations in this state:
open,acceptedorexpired.
- Name
email- Type
- string
- Description
Only invitations to exactly this address.
- Name
page, itemsPerPage- Type
- integer
- Description
See Pagination.
Request
curl "https://ferienpass-musterstadt.de/api/host-invitations?host=kunstschule-musterstadt&status=open" \
-H "Authorization: Bearer $FEPLI_TOKEN"
Response
[
{
"uuid": "01995e3a-7b4c-7d8e-9f0a-1b2c3d4e5f61",
"email": "l.wagner@kunstschule-musterstadt.de",
"host": {
"uuid": "0193c9d1-2e3f-7a4b-8c5d-6e7f8a9b0c18",
"name": "Kunstschule Musterstadt",
"alias": "kunstschule-musterstadt"
},
"invitedBy": {
"uuid": "0193c9e4-8f9a-7b0c-9d1e-2f3a4b5c6d21",
"name": "Mira Schneider"
},
"status": "open",
"createdAt": "2026-09-15T10:12:44+02:00",
"expiresAt": "2026-09-29T10:12:44+02:00",
"acceptedAt": null
}
]
Retrieve an invitation
Returns one invitation. An invitation you may not see is a 404: for organiser users, that is every invitation into another organiser and every invitation to register a new one.
Request
curl https://ferienpass-musterstadt.de/api/host-invitations/01995e3a-7b4c-7d8e-9f0a-1b2c3d4e5f61 \
-H "Authorization: Bearer $FEPLI_TOKEN"
Invite someone into a team
Invites someone into an organiser's team. fepli e-mails them its Einladung zur Mitarbeit notification with a personal link, in your name: the default text reads "Sie wurden von Mira Schneider eingeladen …". Following the link, the person signs in or registers and joins the team, with access to everything the organiser has. Admins find the e-mail in the outbox.
Admins and the organiser's own members can invite. Anyone else gets a 403.
- In whose name. With a personal token, the e-mail names you. With a service account, it names the service account where the text names the inviter ("Sie wurden von Support-Team eingeladen …"), so give it a name that means something to the recipient. The invitation's
invitedBystaysnullthen. - Once per address. If an invitation to this address into this organiser is still open, it is renewed rather than duplicated: the same
uuidwith a newexpiresAt, and the e-mail goes out again. If the earlier one has expired, a new invitation is created. - Whether the address already has a fepli account doesn't matter: either way the person ends up in the team.
An invalid address is a 422. An address that already belongs to a member of this organiser (ignoring case) is a 409.
Required attributes
- Name
email- Type
- string
- Description
The address to invite.
Request
curl -X POST https://ferienpass-musterstadt.de/api/hosts/0193c9d1-2e3f-7a4b-8c5d-6e7f8a9b0c18/invitations \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"email": "l.wagner@kunstschule-musterstadt.de"}'
Response (201 Created)
{
"uuid": "01995e3a-7b4c-7d8e-9f0a-1b2c3d4e5f61",
"email": "l.wagner@kunstschule-musterstadt.de",
"host": {
"uuid": "0193c9d1-2e3f-7a4b-8c5d-6e7f8a9b0c18",
"name": "Kunstschule Musterstadt",
"alias": "kunstschule-musterstadt"
},
"invitedBy": {
"uuid": "0193c9e4-8f9a-7b0c-9d1e-2f3a4b5c6d21",
"name": "Mira Schneider"
},
"status": "open",
"createdAt": "2026-09-15T10:12:44+02:00",
"expiresAt": "2026-09-29T10:12:44+02:00",
"acceptedAt": null
}
Invite a new organiser
Invites someone to register a new organiser. Admins only. fepli sends the e-mail the admin's Veranstaltende einladen sends, to one address, with a personal link. Following it, the person describes their organisation and creates their access; the organiser and its account only come into being then. The e-mail is sent in the background and appears in the outbox.
Without subject and text, the e-mail uses the admin's default wording, which invites the organiser to submit offers for the edition and is signed with sender: your name, or the service account's name.
- If an invitation to this address is still open, it is renewed (same
uuid, newexpiresAt) and the e-mail goes out again. - An address whose account already belongs to an organiser is a
409: registering would make a second organiser. Invite them into the other team instead. An account without an organiser is fine; registering adds the new organiser to it. - If the edition asks organisers to sign a confidentiality declaration, you must have signed it before you write to organisers about that edition, as in the admin. Otherwise the request is a
409. This doesn't apply to service accounts. - An invalid address, an unknown
editionor atextwithout{{ inviteLink }}is a422.
Required attributes
- Name
email- Type
- string
- Description
The address to invite.
Optional attributes
- Name
edition- Type
- string
- Description
The edition the invitation is about (UUID or alias). Defaults to the edition whose editing phase for organisers is open.
- Name
subject- Type
- string
- Description
The subject line, up to 255 characters. Defaults to "Einladung: Ferienpass edition – jetzt Angebote einreichen".
- Name
text- Type
- string
- Description
The message, in Markdown; HTML is removed. It must contain
{{ inviteLink }}, which becomes the recipient's personal link. It may use{{ edition.name }}and{{ sender }}. The default text says the link is valid for 14 days: if your installation keeps invitations valid for longer or shorter, write your own text.
Request
curl -X POST https://ferienpass-musterstadt.de/api/host-invitations \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "info@tanzschule-am-markt.de",
"edition": "herbstferien-2026",
"text": "Guten Tag,\n\nhaben Sie Lust, in den Herbstferien einen Schnupperkurs anzubieten? Hier legen Sie Ihren Zugang an:\n\n{{ inviteLink }}\n\nViele Grüße\n{{ sender }}"
}'
Response (201 Created)
{
"uuid": "01995e41-2c3d-7e4f-8a5b-6c7d8e9f0a72",
"email": "info@tanzschule-am-markt.de",
"host": null,
"invitedBy": {
"uuid": "0190a1b2-c3d4-7e5f-8a6b-7c8d9e0f1a22",
"name": "Sabine Krüger"
},
"status": "open",
"createdAt": "2026-09-15T11:03:09+02:00",
"expiresAt": "2026-09-29T11:03:09+02:00",
"acceptedAt": null
}
Send an invitation again
E-mails an invitation again and pushes its expiresAt out, as Erneut senden does in the admin. The request has no body. Responds with 200 OK and the invitation.
- Team invitations follow the rules for inviting someone into a team: you must be allowed to change the organiser, and the e-mail goes out in your name (or the service account's). If the person has joined the team in the meantime, the request is a
409. - Invitations to register a new organiser are for admins only. fepli doesn't keep the text of the first e-mail, so the default text goes out, about the edition whose editing phase is open. The same
409s apply as when inviting.
If the invitation had already expired, a new one is created and returned, with its own uuid; the expired one stays in the list. An accepted invitation can't be sent again (409).
Request
curl -X POST https://ferienpass-musterstadt.de/api/host-invitations/01995e3a-7b4c-7d8e-9f0a-1b2c3d4e5f61/resend \
-H "Authorization: Bearer $FEPLI_TOKEN"
Response (excerpt)
{
"uuid": "01995e3a-7b4c-7d8e-9f0a-1b2c3d4e5f61",
"status": "open",
"expiresAt": "2026-10-06T09:40:02+02:00",
"…": "…"
}
Withdraw an invitation
Withdraws an invitation: it is deleted and no longer shows as invited in the admin. Responds with 204 No Content. The same people may withdraw an invitation as may send it again.
The e-mail can't be recalled, but its link stops working: an invitation link only works while its invitation is open, and only once. Following a withdrawn, expired or already used link shows "Diese Einladung gilt nicht mehr".
An accepted invitation can't be withdrawn (409).
Request
curl -X DELETE https://ferienpass-musterstadt.de/api/host-invitations/01995e3a-7b4c-7d8e-9f0a-1b2c3d4e5f61 \
-H "Authorization: Bearer $FEPLI_TOKEN"