fepli
EntwicklerAPI-Ressourcen

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.

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ält published, 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 Zeitstempel begin und meist einen Zeitstempel end. Wiederkehrende Termine haben dazu eine iCalendar-Regel recurrence (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: maxParticipants abzü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, oder private_link fü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, email und phone.

  • 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, withdrawn und rejected. total zählt jede Anmeldung außer denen mit withdrawn und 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, die question, ihren type (yn Ja/Nein, int Zahl, txt Text, choice Auswahl, file Upload), die Angabe, ob sie required ist, und ob sie von der Saison stammt (season). Uploads nennen die zulässigen fileTypes (image, pdf). Eine Auswahl nennt ihre options, jede mit einem label und einem price in Cent, der zum Beitrag hinzukommt; price ist null bei 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}/variants an.

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

ÜbergangVonNachWer ihn anwenden darf
finalizedraftfinalizedalle, die das Angebot sehen
to_draftfinalized oder revieweddraftAdmins; Veranstalter:innen, wenn die Saison ihnen das Veröffentlichen erlaubt
approvefinalized, außer abgeschlossenreviewedAdmins; Veranstalter:innen, wenn die Saison ihnen das Veröffentlichen erlaubt
unapprovereviewedfinalizedAdmins; Veranstalter:innen, wenn die Saison ihnen das Veröffentlichen erlaubt
publishreviewedpublishedAdmins; Veranstalter:innen, wenn die Saison ihnen das Veröffentlichen erlaubt
unpublishpublishedreviewedAdmins; Veranstalter:innen, wenn die Saison ihnen das Veröffentlichen erlaubt
cancelpublished und nicht abgesagt, bevor der letzte Termin endetergänzt cancelledAdmins; 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
relaunchcancelled, bevor der letzte Termin endetpublishedwie bei cancel
completepublished, nachdem der letzte Termin geendet hatergänzt completedAdmins; 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.


GET/offers

Alle 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. published trifft 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 from passt ein Angebot mit mehreren Terminen, wenn ein Termin an oder nach from liegt und ein Termin an oder vor until. 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, createdAt oder modifiedAt.

  • Name
    order
    Typ
    string
    Beschreibung

    asc (Standard) oder desc.

  • Name
    page, itemsPerPage
    Typ
    integer
    Beschreibung

    Siehe Paginierung.

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

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

GET/offers/{uuid}
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"]
}

POST/offers

Ein 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 begin und wahlweise mit end und recurrence.

  • Name
    categories
    Typ
    string[]
    Beschreibung

    Kategorien, als UUIDs oder Aliasse.

  • Name
    publish
    Typ
    string
    Beschreibung

    public (Standard), oder private_link für ein Angebot, das nur über seinen privaten Link erreichbar ist.

  • Name
    contact
    Typ
    object[]
    Beschreibung

    Kontaktpersonen: Objekte mit name, email und phone. 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.

POST/offers
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"]
}

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

PATCH/offers/{uuid}
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.


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

DELETE/offers/{uuid}
curl -X DELETE https://example.fepli.eu/api/offers/0193c8a2-5d6e-7f70-9a8b-1c2d3e4f5a14 \
  -H "Authorization: Bearer $FEPLI_TOKEN"

POST/offers/{uuid}/transition

Einen Ü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 cancel und relaunch: der Text der E-Mail an die Familien mit Platz. Ohne ihn wird keine E-Mail verschickt.

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

POST/offers/{uuid}/copy

Ein 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.

POST/offers/{uuid}/copy
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"]
}

POST/offers/{uuid}/variants

Eine 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.

POST/offers/{uuid}/variants
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"
  }
}

POST/offers/{uuid}/refill

Von 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. Mit false bleiben sie zurückgehalten, bis die Entscheidungen der Saison festgeschrieben werden. notify muss dann ebenfalls false sein, sonst ist die Antwort 422.

POST/offers/{uuid}/refill
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
  }
}

War diese Seite hilfreich?