Angebote
Ein Angebot ist eine Aktivität einer Saison: ein Kurs, ein Ausflug, ein Workshop. Eine oder mehrere Veranstalter:innen führen es an einem oder mehreren Terminen durch. In der API ist ein Angebot ein offer. Angebote sind der einzige öffentliche Teil der API: Die veröffentlichten Angebote lassen sich ohne Token lesen.
- GET
/offersAlle Angebote abrufen - GET
/offers/{uuid}Ein Angebot abrufen - POST
/offersEin Angebot anlegen - PATCH
/offers/{uuid}Ein Angebot ändern - DELETE
/offers/{uuid}Ein Angebot löschen - POST
/offers/{uuid}/transitionEinen Übergang anwenden - POST
/offers/{uuid}/copyEin Angebot kopieren - POST
/offers/{uuid}/variantsEine Variante anlegen - POST
/offers/{uuid}/refillVon der Warteliste auffüllen
Das Modell des Angebots
Felder mit dem Vermerk mit Token erhalten nur authentifizierte Aufrufer. Felder ohne Wert fehlen in den Antworten.
Eigenschaften
- Name
uuid- Typ
- string
- Beschreibung
Die Kennung des Angebots.
- Name
name- Typ
- string
- Beschreibung
Der Titel des Angebots.
- Name
alias- Typ
- string
- Beschreibung
Eine URL-taugliche Fassung des Namens.
- Name
edition- Typ
- reference
- Beschreibung
Die Saison, zu der das Angebot gehört.
- Name
hosts- Typ
- reference[]
- Beschreibung
Die Veranstalter:innen, die das Angebot durchführen.
- Name
status- Typ
- string[]
- Beschreibung
Die Status des Workflows, in denen das Angebot steht:
draft,finalized,reviewed,published,cancelled,completed. Meist ist es einer. Ein veröffentlichtes Angebot behältpublished, wenn es abgesagt oder abgeschlossen wird. Ein abgesagtes Angebot hat deshalb["published", "cancelled"].
- Name
teaser- Typ
- string
- Beschreibung
Eine Zusammenfassung in einer Zeile.
- Name
description- Typ
- string
- Beschreibung
Die vollständige Beschreibung, formatiert als Markdown.
- Name
dates- Typ
- object[]
- Beschreibung
Die Termine des Angebots. Jeder hat eine
uuid, einen Zeitstempelbeginund meist einen Zeitstempelend. Wiederkehrende Termine haben dazu eine iCalendar-Regelrecurrence(RRULE).
- Name
fee- Typ
- integer
- Beschreibung
Der Beitrag in Cent. Fehlt das Feld oder ist es
0, ist das Angebot kostenlos.
- Name
minAge- Typ
- integer
- Beschreibung
Das Mindestalter der Teilnehmer:innen in Jahren.
- Name
maxAge- Typ
- integer
- Beschreibung
Das Höchstalter der Teilnehmer:innen in Jahren.
- Name
minParticipants- Typ
- integer
- Beschreibung
Wie viele Teilnehmer:innen das Angebot braucht, damit es stattfindet.
- Name
maxParticipants- Typ
- integer
- Beschreibung
Wie viele Teilnehmer:innen das Angebot aufnimmt. Fehlt, wenn die Zahl unbegrenzt ist.
- Name
vacancies- Typ
- integer
- Beschreibung
Freie Plätze:
maxParticipantsabzüglich der Anmeldungen mit Zusage und der Anmeldungen auf der Warteliste. Fehlt, wenn die Plätze unbegrenzt sind.
- Name
fullyBooked- Typ
- boolean
- Beschreibung
Ob kein Platz mehr frei ist.
- Name
requiresApplication- Typ
- boolean
- Beschreibung
Ob Teilnehmer:innen sich anmelden müssen. Sonst kommen sie ohne Anmeldung.
- Name
onlineApplication- Typ
- boolean
- Beschreibung
Ob Familien sich auf der Website von fepli anmelden können.
- Name
applicationDeadline- Typ
- timestamp
- Beschreibung
Der Anmeldeschluss.
- Name
meetingPoint- Typ
- string
- Beschreibung
Eine kurze Bezeichnung des Treffpunkts, etwa „Haupteingang Stadtpark“.
- Name
meetingAddress- Typ
- string
- Beschreibung
Die Anschrift des Treffpunkts.
- Name
meetingLat- Typ
- number
- Beschreibung
Der Breitengrad des Treffpunkts (WGS 84).
- Name
meetingLng- Typ
- number
- Beschreibung
Der Längengrad des Treffpunkts (WGS 84).
- Name
bring- Typ
- string
- Beschreibung
Was Teilnehmer:innen mitbringen sollen.
- Name
applyText- Typ
- string
- Beschreibung
Zusätzliche Hinweise, die bei der Anmeldung erscheinen, formatiert als Markdown.
- Name
wheelchairAccessible- Typ
- boolean
- Beschreibung
Ob das Angebot rollstuhlgerecht ist.
- Name
accessibility- Typ
- string[]
- Beschreibung
Weitere Merkmale der Barrierefreiheit.
- Name
categories- Typ
- reference[]
- Beschreibung
Die Kategorien, denen das Angebot zugeordnet ist.
- Name
url- Typ
- string
- Beschreibung
Die Seite des Angebots auf der Website von fepli, auf der Familien sich anmelden.
- Name
media- Typ
- string[]
- Beschreibung
Absolute URLs der Bilder des Angebots, skaliert auf höchstens 3000 × 3000 Pixel.
- Name
thumbnails- Typ
- string[]
- Beschreibung
Dieselben Bilder, zugeschnitten auf 800 × 600 Pixel: die Größe für eine Karte oder eine Liste.
- Name
createdAt- Typ
- timestamp
- Beschreibung
Wann das Angebot angelegt wurde.
- Name
modifiedAt- Typ
- timestamp
- Beschreibung
Wann das Angebot zuletzt geändert wurde.
- Name
publish- Typ
- string
- Zugriff
- mit Token
- Beschreibung
public, oderprivate_linkfür ein Angebot, das nur über seinen privaten Link erreichbar ist.
- Name
comment- Typ
- string
- Zugriff
- mit Token
- Beschreibung
Eine interne Notiz, die nie öffentlich erscheint.
- Name
contact- Typ
- object[]
- Zugriff
- mit Token
- Beschreibung
Die Kontaktpersonen für die Seite des Angebots auf der Website von fepli, wie eingegeben: Objekte mit
name,emailundphone.
- Name
collectDateOfBirth- Typ
- boolean
- Zugriff
- mit Token
- Beschreibung
Ob das Anmeldeformular nach dem Geburtsdatum der Teilnehmer:in fragt.
- Name
disableOnlinePayment- Typ
- boolean
- Zugriff
- mit Token
- Beschreibung
Ob die Online-Zahlung für dieses Angebot ausgeschaltet ist.
- Name
attendances- Typ
- object
- Zugriff
- mit Token
- Beschreibung
Wie viele Anmeldungen das Angebot hat, nach Status:
confirmed,waitlisted,waiting,withdrawnundrejected.totalzählt jede Anmeldung außer denen mitwithdrawnund den nicht erfüllten.
- Name
applicationQuestions- Typ
- object[]
- Zugriff
- mit Token
- Beschreibung
Die Zusatzfragen, die das Anmeldeformular bei diesem Angebot stellt: zuerst die der Saison des Angebots, dann die eigenen. Jede hat eine
uuid, diequestion, ihrentype(ynJa/Nein,intZahl,txtText,choiceAuswahl,fileUpload), die Angabe, ob sierequiredist, und ob sie von der Saison stammt (season). Uploads nennen die zulässigenfileTypes(image,pdf). Eine Auswahl nennt ihreoptions, jede mit einemlabelund einempricein Cent, der zum Beitrag hinzukommt;priceistnullbei einer Option ohne Aufpreis.
- Name
variantOf- Typ
- reference
- Zugriff
- mit Token
- Beschreibung
Das Angebot, dessen Variante dieses Angebot ist, zum Beispiel ein anderer Termin desselben Kurses.
- Name
variants- Typ
- reference[]
- Zugriff
- mit Token
- Beschreibung
Die Varianten dieses Angebots. Eine Variante legen Sie mit
POST /offers/{uuid}/variantsan.
- Name
transitions- Typ
- string[]
- Zugriff
- mit Token
- Beschreibung
Die Übergänge des Workflows, die Sie jetzt anwenden dürfen.
Der Workflow eines Angebots
Ein Angebot durchläuft dieselben Status wie im Admin-Panel. Eine Veranstalter:in legt es als Entwurf an und reicht es ein (finalize). Admins geben es frei (approve) und veröffentlichen es (publish). Einen Übergang wenden Sie mit POST /offers/{uuid}/transition an.
| Übergang | Von | Nach | Wer ihn anwenden darf |
|---|---|---|---|
finalize | draft | finalized | alle, die das Angebot sehen |
to_draft | finalized oder reviewed | draft | Admins; Veranstalter:innen, wenn die Saison ihnen das Veröffentlichen erlaubt |
approve | finalized, außer abgeschlossen | reviewed | Admins; Veranstalter:innen, wenn die Saison ihnen das Veröffentlichen erlaubt |
unapprove | reviewed | finalized | Admins; Veranstalter:innen, wenn die Saison ihnen das Veröffentlichen erlaubt |
publish | reviewed | published | Admins; Veranstalter:innen, wenn die Saison ihnen das Veröffentlichen erlaubt |
unpublish | published | reviewed | Admins; Veranstalter:innen, wenn die Saison ihnen das Veröffentlichen erlaubt |
cancel | published und nicht abgesagt, bevor der letzte Termin endet | ergänzt cancelled | Admins; Veranstalter:innen, wenn die Installation ihnen das Bearbeiten ihrer Teilnahmelisten erlaubt, ihre Teilnahmeliste freigegeben und geöffnet ist, sie Mitglied eines Veranstalter-Profils des Angebots sind und die Vertraulichkeitserklärung der Saison unterschrieben haben, sofern sie eine verlangt |
relaunch | cancelled, bevor der letzte Termin endet | published | wie bei cancel |
complete | published, nachdem der letzte Termin geendet hat | ergänzt completed | Admins; Veranstalter:innen, die das Angebot sehen |
Ein abgeschlossenes Angebot lässt sich weder absagen noch wieder aufnehmen. Darf eine Veranstalter:in cancel oder relaunch nicht anwenden, fehlt die Transition in den transitions des Angebots.
/offersAlle Angebote abrufen
Liefert eine Seite mit Angeboten, sortiert nach ihrem ersten Termin.
- Ohne Token: die veröffentlichten, öffentlichen Angebote der Saisons, die online sind, mit den öffentlichen Feldern.
- Mit Token: jedes Angebot, das Sie im Admin-Panel öffnen könnten, in jedem Status und mit allen Feldern. Admins sehen alle Angebote. Veranstalter:innen sehen die Angebote ihrer Veranstalter-Profile und die Angebote, die mit ihnen geteilt wurden. Ein Token, dessen Inhaber:in weder Admin noch Mitglied eines Veranstalter-Profils ist, sieht kein Angebot, auch kein veröffentlichtes. Lassen Sie das Token weg, um die veröffentlichten zu lesen.
Optionale Filter
- Name
q- Typ
- string
- Beschreibung
Nur Angebote, deren Name diesen Text enthält.
- Name
edition- Typ
- string
- Beschreibung
Nur Angebote dieser Saison (UUID oder Alias).
- Name
key- Typ
- string
- Beschreibung
Ein öffentlicher Schlüssel, für eine Seite einer anderen Website. Nur ohne Token.
- Name
host- Typ
- string
- Beschreibung
Nur Angebote dieser Veranstalter:in (UUID oder Alias).
- Name
category- Typ
- string
- Beschreibung
Nur Angebote dieser Kategorie (UUID oder Alias).
- Name
status- Typ
- string
- Beschreibung
Nur Angebote in diesen Status, durch Kommas getrennt:
draft,finalized,reviewed,published,cancelled,completed.publishedtrifft auch Angebote, die nach der Veröffentlichung abgesagt wurden.
- Name
from- Typ
- date
- Beschreibung
Nur Angebote mit einem Termin, der an diesem Tag oder später beginnt.
- Name
until- Typ
- date
- Beschreibung
Nur Angebote mit einem Termin, der an diesem Tag oder früher beginnt. Zusammen mit
frompasst ein Angebot mit mehreren Terminen, wenn ein Termin an oder nachfromliegt und ein Termin an oder voruntil. Es muss nicht derselbe Termin sein.
- Name
modifiedSince- Typ
- timestamp
- Beschreibung
Nur Angebote, die seit diesem Zeitpunkt geändert wurden.
- Name
sort- Typ
- string
- Beschreibung
begin(Standard, der erste Termin),name,createdAtodermodifiedAt.
- Name
order- Typ
- string
- Beschreibung
asc(Standard) oderdesc.
- Name
page, itemsPerPage- Typ
- integer
- Beschreibung
Siehe Paginierung.
curl -G https://example.fepli.eu/api/offers \
-d edition=herbstferien-2026 \
-d from=2026-10-12
Antwort
[
{
"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"
},
"hosts": [
{
"uuid": "01905a7e-8c21-7b3f-a0d4-3e9f1c6b2a02",
"name": "Stadtjugendring Elmsbrück e.V.",
"alias": "stadtjugendring-elmsbrueck"
}
],
"status": ["published"],
"teaser": "Mit dem Rad durch den Park – mit Picknick am See.",
"description": "Eine **geführte Fahrradtour** für Kinder ab 8 Jahren.",
"dates": [
{
"uuid": "0192a4f2-0a11-7e6c-9d38-2b7f5c1e8a04",
"begin": "2026-10-14T09:00:00+02:00",
"end": "2026-10-14T12:00:00+02:00"
}
],
"fee": 750,
"minAge": 8,
"maxAge": 12,
"maxParticipants": 15,
"vacancies": 4,
"fullyBooked": false,
"requiresApplication": true,
"onlineApplication": true,
"applicationDeadline": "2026-09-30T23:59:59+02:00",
"meetingPoint": "Haupteingang Stadtpark",
"meetingAddress": "Parkstraße 1, 12345 Elmsbrück",
"meetingLat": 52.520008,
"meetingLng": 13.404954,
"bring": "Fahrrad und Helm",
"wheelchairAccessible": false,
"categories": [
{
"uuid": "018f2c3d-4e5f-7a6b-8c7d-9e0f1a2b3c12",
"name": "Sport & Bewegung",
"alias": "sport-bewegung"
}
],
"url": "https://example.fepli.eu/angebote/herbstferien-2026/1C8wV6pQk2Tz9RfXh4MbNd-fahrradtour-durch-den-stadtpark",
"media": [
"https://example.fepli.eu/assets/images/f/fahrradtour-3000x2000.jpg"
],
"thumbnails": [
"https://example.fepli.eu/assets/images/a/fahrradtour-800x600.jpg"
],
"createdAt": "2026-08-03T10:12:44+02:00",
"modifiedAt": "2026-09-15T16:40:02+02:00"
}
]
/offers/{uuid}Ein Angebot abrufen
Liefert ein Angebot. Es gelten dieselben Regeln der Sichtbarkeit wie bei der Liste: Ohne Token lässt sich nur ein veröffentlichtes, öffentliches Angebot einer Saison abrufen, die online ist. Alles andere ist ein 404.
Eine Seite einer anderen Website übergibt ihren öffentlichen Schlüssel als key, wie bei der Liste.
Mit Token enthält das Angebot die internen Felder, darunter die Zahl der Anmeldungen und die transitions, die Sie anwenden dürfen.
curl https://example.fepli.eu/api/offers/0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03 \
-H "Authorization: Bearer $FEPLI_TOKEN"
Antwort (mit Token, Auszug)
{
"uuid": "0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03",
"name": "Fahrradtour durch den Stadtpark",
"status": ["published"],
"…": "…",
"publish": "public",
"comment": "Leihräder beim ADFC angefragt.",
"contact": [
{
"name": "Jonas Becker",
"email": "j.becker@sjr.example.fepli.eu",
"phone": "0123 456789"
}
],
"collectDateOfBirth": false,
"disableOnlinePayment": false,
"attendances": {
"confirmed": 11,
"waitlisted": 0,
"waiting": 2,
"withdrawn": 1,
"rejected": 0,
"total": 13
},
"applicationQuestions": [
{
"uuid": "0192a4f4-1b2c-7d3e-8f4a-5b6c7d8e9f13",
"question": "Kann Ihr Kind sicher Fahrrad fahren?",
"type": "yn",
"required": true,
"fileTypes": [],
"options": [],
"season": true
},
{
"uuid": "0192a4f4-1b2c-7d3e-8f4a-5b6c7d8e9f14",
"question": "Mittagessen",
"type": "choice",
"required": false,
"fileTypes": [],
"options": [
{ "label": "vegetarisch", "price": 4000 },
{ "label": "ohne Mittagessen", "price": null }
],
"season": false
}
],
"variants": [],
"transitions": ["cancel", "unpublish"]
}
/offersEin Angebot anlegen
Legt ein Angebot im Status draft an. Admins legen Angebote in jeder Saison an. Veranstalter:innen legen sie für ihre eigenen Veranstalter-Profile an, in Saisons, deren Phase host_editing_stage aktiv ist.
Legt eine Person das Angebot an, erhält sie vor dem Termin die E-Mails mit dem Link auf die Teilnahmeliste (Handbuch). Die API zeigt nicht, wer diese E-Mails erhält, und legt es nicht fest. Das geschieht im Admin-Panel unter Listen-Empfänger:innen. Ist eine Veranstalter:in Mitglied genau eines Veranstalter-Profils, wird dieses automatisch eingetragen.
Ohne contact übernimmt das Angebot den Kontakt aus dem Profil seiner ersten Veranstalter:in: Name, E-Mail-Adresse und Telefonnummer. Hat das Profil weder E-Mail-Adresse noch Telefonnummer, bleibt das Angebot ohne Kontakt. Dasselbe gilt für ein Angebot ohne Veranstalter:innen. Senden Sie contact, um andere Kontaktpersonen zu nennen, oder [] für keine.
Pflichtattribute
- Name
name- Typ
- string
- Beschreibung
Der Titel des Angebots.
- Name
edition- Typ
- string
- Beschreibung
Die Saison, als UUID oder Alias. Veranstalter:innen müssen eine nennen. Sonst ist die Antwort
403.
Optionale Attribute
- Name
hosts- Typ
- string[]
- Beschreibung
Veranstalter:innen, als UUIDs oder Aliasse. Veranstalter:innen dürfen nur ihre eigenen Veranstalter-Profile nennen.
- Name
dates- Typ
- object[]
- Beschreibung
Termine, jeder mit
beginund wahlweise mitendundrecurrence.
- Name
categories- Typ
- string[]
- Beschreibung
Kategorien, als UUIDs oder Aliasse.
- Name
publish- Typ
- string
- Beschreibung
public(Standard), oderprivate_linkfür ein Angebot, das nur über seinen privaten Link erreichbar ist.
- Name
contact- Typ
- object[]
- Beschreibung
Kontaktpersonen: Objekte mit
name,emailundphone. Standard sind die Kontaktdaten aus dem Profil der ersten Veranstalter:in.
Außerdem lassen sich teaser, description, fee, minAge, maxAge, minParticipants, maxParticipants, requiresApplication, onlineApplication, applicationDeadline, meetingPoint, meetingAddress, meetingLat, meetingLng, bring, applyText, wheelchairAccessible, accessibility, comment, collectDateOfBirth und disableOnlinePayment senden, wie im Modell beschrieben.
Altersangaben reichen von 0 bis 99. Beiträge und Teilnehmerzahlen dürfen nicht negativ sein. Kurze Texte wie meetingPoint, bring, applyText und comment sind auf 255 Zeichen begrenzt.
curl -X POST https://example.fepli.eu/api/offers \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Töpfern für Anfänger",
"edition": "herbstferien-2026",
"hosts": ["stadtjugendring-elmsbrueck"],
"dates": [
{ "begin": "2026-10-20T14:00:00+02:00", "end": "2026-10-20T16:30:00+02:00" }
],
"fee": 500,
"minAge": 6,
"maxAge": 10,
"maxParticipants": 8,
"requiresApplication": true,
"onlineApplication": true,
"categories": ["kreativ"]
}'
Antwort (201 Created, Auszug)
{
"uuid": "0193c8a2-5d6e-7f70-9a8b-1c2d3e4f5a14",
"name": "Töpfern für Anfänger",
"alias": "toepfern-fuer-anfaenger",
"status": ["draft"],
"…": "…",
"transitions": ["finalize"]
}
/offers/{uuid}Ein Angebot ändern
Ändert ein Angebot. Senden Sie nur die Attribute, die Sie ändern wollen. Es sind dieselben Attribute wie beim Anlegen eines Angebots. null leert ein Feld. name, edition, hosts, dates, categories, publish und die Ja/Nein-Felder ignorieren null. Ein leerer Body ist ein 422.
Termine werden als Ganzes ersetzt, wenn Sie dates senden. Um einen bestehenden Termin zu behalten, senden Sie seine uuid mit. Termine, die Sie weglassen, werden gelöscht, und Termine ohne uuid kommen hinzu.
Admins ändern jedes Angebot. Veranstalter:innen ändern ihre Angebote, bis diese freigegeben oder veröffentlicht sind, und nur, solange die Saison zur Bearbeitung offen ist (siehe editableForHosts der Saison). Sonst ist die Antwort 403.
Veranstalter:innen ändern nicht, wer ein Angebot durchführt: hosts muss dieselben Veranstalter-Profile nennen wie bisher, in beliebiger Reihenfolge, sonst ist die Antwort 403. Wechselt edition, müssen sie in der neuen Saison Angebote anlegen dürfen, wie beim Anlegen eines Angebots. Sonst ist die Antwort 403.
curl -X PATCH https://example.fepli.eu/api/offers/0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03 \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"maxParticipants": 18,
"dates": [
{
"uuid": "0192a4f2-0a11-7e6c-9d38-2b7f5c1e8a04",
"begin": "2026-10-14T09:00:00+02:00",
"end": "2026-10-14T12:30:00+02:00"
},
{ "begin": "2026-10-16T09:00:00+02:00", "end": "2026-10-16T12:30:00+02:00" }
]
}'
Die Antwort enthält das geänderte Angebot.
/offers/{uuid}Ein Angebot löschen
Löscht ein Angebot mit seinen Anmeldungen. Die Antwort ist 204 No Content.
Die API lehnt das Löschen mit 409 ab, solange sich ein bezahlter Beleg auf eine Anmeldung des Angebots bezieht. Stornieren Sie zuerst den Beleg, oder sagen Sie das Angebot ab. Veranstalter:innen löschen nur Angebote, die weder freigegeben noch veröffentlicht sind und noch keine Anmeldungen haben, und nur, solange die Saison zur Bearbeitung offen ist (siehe editableForHosts der Saison).
Hat das Angebot Varianten, tritt die nächste als Hauptangebot an seine Stelle.
curl -X DELETE https://example.fepli.eu/api/offers/0193c8a2-5d6e-7f70-9a8b-1c2d3e4f5a14 \
-H "Authorization: Bearer $FEPLI_TOKEN"
/offers/{uuid}/transitionEinen Übergang anwenden
Führt das Angebot durch seinen Workflow. Die transitions des Angebots nennen die Übergänge, die Sie jetzt anwenden dürfen. Alles andere ist ein 409, das die möglichen Übergänge nennt. Das gilt auch für einen Übergang, für den Ihnen die Berechtigung fehlt.
cancel und relaunch benachrichtigen die Familien mit Platz per E-Mail, wenn Sie einen notifyText übergeben, wie im Admin-Panel. Ohne notifyText wird keine E-Mail verschickt.
Pflichtattribute
- Name
transition- Typ
- string
- Beschreibung
Einer von
finalize,to_draft,approve,unapprove,publish,unpublish,cancel,relaunch,complete.
Optionale Attribute
- Name
notifyText- Typ
- string
- Beschreibung
Für
cancelundrelaunch: der Text der E-Mail an die Familien mit Platz. Ohne ihn wird keine E-Mail verschickt.
curl -X POST https://example.fepli.eu/api/offers/0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03/transition \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"transition": "cancel",
"notifyText": "Leider muss die Fahrradtour wegen Sturmwarnung ausfallen."
}'
Antwort (Auszug)
{
"uuid": "0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03",
"status": ["published", "cancelled"],
"…": "…",
"transitions": ["relaunch", "unpublish"]
}
/offers/{uuid}/copyEin Angebot kopieren
Kopiert ein Angebot in ein neues Angebot im Status draft, wie Angebot kopieren im Admin-Panel. Die Antwort ist 201 Created mit der Kopie. Das Original bleibt unverändert.
Ohne edition entsteht die Kopie in der Saison des Angebots, mit den Terminen. Mit edition entsteht sie in dieser Saison, und die Termine und der Anmeldeschluss bleiben zurück: Sie gehörten zu den alten Ferien. Die neuen ergänzen Sie mit PATCH /offers/{uuid}. Das gilt auch, wenn Sie die Saison des Angebots selbst nennen.
Sie müssen das Original sehen dürfen, sonst ist die Antwort 404. Außerdem müssen Sie in der Saison der Kopie ein Angebot anlegen dürfen: Admins dürfen das immer, Veranstalter:innen, solange die Phase host_editing_stage dieser Saison aktiv ist. Sonst ist die Antwort 403. Eine edition, die es nicht gibt, ist ein 422.
Was eine Kopie übernimmt
Die Kopie übernimmt die Texte und Einstellungen des Originals: Name, Teaser, Beschreibung, Beitrag, Altersangaben, Teilnehmerzahlen, die Einstellungen zur Anmeldung und die Zusatzfragen, Treffpunkt, Mitzubringendes, Barrierefreiheit, Kategorien, Veranstalter:innen, Kontaktpersonen, die Konten, die die E-Mails zur Teilnahmeliste erhalten, den internen comment, publish und die Einverständniserklärungen. Bilder und Anhänge werden ebenfalls übernommen. Die Kopie verweist auf dieselben Dateien.
Sie übernimmt nicht, was das Original gesammelt hat: Anmeldungen, Kommentare, den Verlauf, Varianten und die Konten, mit denen das Angebot direkt geteilt wurde. Eine Kopie ist immer ein eigenes Angebot, auch wenn das Original eine Variante ist. Sie erhält eine neue uuid und einen eigenen privaten Link. createdAt und modifiedAt nennen den Zeitpunkt der Kopie.
Optionale Attribute
- Name
edition- Typ
- string
- Beschreibung
Die Saison, in die kopiert wird, als UUID oder Alias. Ohne sie entsteht die Kopie in der Saison des Angebots, mit den Terminen.
Die Anfrage braucht einen JSON-Body: Senden Sie {}, um innerhalb der Saison zu kopieren.
Eine ganze Saison kopieren
Dafür gibt es keinen eigenen Endpunkt. Rufen Sie die Angebote mit GET /offers?edition=… ab und kopieren Sie jedes in die neue Saison. Aus Vorjahr kopieren im Admin-Panel lässt die Varianten aus, also Angebote mit variantOf, damit aus ihnen keine eigenen Angebote werden. Verfahren Sie ebenso, wenn Sie dasselbe Ergebnis wollen.
curl -X POST https://example.fepli.eu/api/offers/0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03/copy \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"edition": "herbstferien-2027"}'
Antwort (201 Created, Auszug)
{
"uuid": "019a3b1e-7c2d-7e4f-8a5b-6c7d8e9f0a21",
"name": "Fahrradtour durch den Stadtpark",
"edition": {
"uuid": "019a3b10-2c3d-7e4f-9a5b-6c7d8e9f0a20",
"name": "Herbstferien 2027",
"alias": "herbstferien-2027"
},
"status": ["draft"],
"dates": [],
"fee": 750,
"…": "…",
"attendances": {
"confirmed": 0,
"waitlisted": 0,
"waiting": 0,
"withdrawn": 0,
"rejected": 0,
"total": 0
},
"transitions": ["finalize"]
}
/offers/{uuid}/variantsEine Variante anlegen
Legt eine Variante eines Angebots an: dieselbe Aktivität für eine andere Gruppe von Teilnehmer:innen, meist an anderen Terminen. Das entspricht Neuen Termin erstellen im Admin-Panel. Die Antwort ist 201 Created mit der neuen Variante.
Eine Variante ist eine Kopie im Status draft, in derselben Saison und mit denselben Terminen, die mit dem Hauptangebot verknüpft ist: Ihr variantOf nennt das Hauptangebot, und das Hauptangebot führt sie in variants. Ihre Termine ändern Sie mit PATCH /offers/{uuid}. Die Variante einer Variante ist mit demselben Hauptangebot verknüpft.
Die Anfrage hat keinen Body. Es gelten dieselben Berechtigungen wie für eine Kopie: 404, wenn Sie das Angebot nicht sehen, und 403, wenn Sie in seiner Saison kein Angebot anlegen dürfen.
curl -X POST https://example.fepli.eu/api/offers/0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03/variants \
-H "Authorization: Bearer $FEPLI_TOKEN"
Antwort (201 Created, Auszug)
{
"uuid": "019a3b2f-1d2e-7f30-8b4c-5d6e7f8a9b22",
"name": "Fahrradtour durch den Stadtpark",
"status": ["draft"],
"dates": [
{
"uuid": "019a3b2f-1d2f-7a41-9c5d-6e7f8a9b0c23",
"begin": "2026-10-14T09:00:00+02:00",
"end": "2026-10-14T12:00:00+02:00"
}
],
"…": "…",
"variantOf": {
"uuid": "0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03",
"name": "Fahrradtour durch den Stadtpark",
"alias": "fahrradtour-durch-den-stadtpark"
}
}
/offers/{uuid}/refillVon der Warteliste auffüllen
Füllt die freien Plätze eines Angebots von seiner Warteliste auf, wie Teilnahmeliste auffüllen im Admin-Panel. Familien rücken in der Reihenfolge der Warteliste nach, unabhängig vom Anmeldeverfahren der Saison. Jede Familie, die nachrückt, erhält eine Zusage, und ihr Beitrag wird fällig wie bei jeder Zusage.
Die Arbeit geschieht im Hintergrund, kurz nach der Anfrage. Die API antwortet mit 202 Accepted und dem Angebot im Stand dieses Augenblicks. Rufen Sie etwas später seine Teilnahmeliste ab, um zu sehen, wer nachgerückt ist.
Um Plätze hinzuzufügen, erhöhen Sie maxParticipants mit PATCH /offers/{uuid} und rufen dann diesen Endpunkt auf. Das entspricht Anzahl Plätze erhöhen im Admin-Panel.
Die API lehnt die Anfrage mit 409 ab, wenn es nichts zu tun gibt: Das Angebot hat keine Termine oder sein erster Termin hat begonnen, niemand steht auf der Warteliste, oder jeder Platz ist vergeben. Die Anfrage braucht die Berechtigung, das Angebot zu ändern. Admins haben sie immer. Veranstalter:innen haben sie nur, bis das Angebot freigegeben oder veröffentlicht ist und solange die Saison zur Bearbeitung offen ist. Sonst ist die Antwort 403.
Optionale Attribute
Die Anfrage braucht einen JSON-Body: Senden Sie {} für die Standardwerte.
- Name
notify- Typ
- boolean
- Beschreibung
Teilt den Familien, die nachrücken, per E-Mail mit, dass sie einen Platz haben. Standard ist
false.
- Name
commit- Typ
- boolean
- Beschreibung
Schreibt die Zusagen sofort fest. Standard ist
true. Mitfalsebleiben sie zurückgehalten, bis die Entscheidungen der Saison festgeschrieben werden.notifymuss dann ebenfallsfalsesein, sonst ist die Antwort422.
curl -X POST https://example.fepli.eu/api/offers/0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03/refill \
-H "Authorization: Bearer $FEPLI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"notify": true}'
Antwort (202 Accepted, Auszug)
{
"uuid": "0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03",
"maxParticipants": 18,
"…": "…",
"attendances": {
"confirmed": 15,
"waitlisted": 5,
"waiting": 0,
"withdrawn": 1,
"rejected": 0,
"total": 20
}
}