fepli
DevelopersAPI resources

Offers

An offer is one activity of an edition: a course, an excursion, a workshop, run by one or more hosts on one or more dates. Offers are the one part of the API that is public: the published offers can be read without a token.

The offer model

Fields marked with a token are returned to authenticated callers only. Fields without a value are left out of responses.

Properties

  • Name
    uuid
    Type
    string
    Description

    The offer's identifier.

  • Name
    name
    Type
    string
    Description

    The title of the offer.

  • Name
    alias
    Type
    string
    Description

    A URL-safe version of the name.

  • Name
    edition
    Type
    reference
    Description

    The edition the offer belongs to.

  • Name
    hosts
    Type
    reference[]
    Description

    The hosts who run the offer.

  • Name
    status
    Type
    string[]
    Description

    The states of the workflow the offer is in: draft, finalized, reviewed, published, cancelled, completed. Usually one. A published offer keeps published when it is cancelled or completed, so a cancelled offer reads ["published", "cancelled"].

  • Name
    teaser
    Type
    string
    Description

    A one-line summary.

  • Name
    description
    Type
    string
    Description

    The full description, formatted as Markdown.

  • Name
    dates
    Type
    object[]
    Description

    The dates of the offer. Each has a uuid, a begin and usually an end timestamp, and for recurring dates an iCalendar recurrence rule (RRULE).

  • Name
    fee
    Type
    integer
    Description

    The fee in cents. Missing or 0 means the offer is free.

  • Name
    currency
    Type
    string
    Description

    The currency of fee, as ISO 4217: EUR or CHF, whichever the organisation bills in. Read-only; the default is EUR.

  • Name
    minAge
    Type
    integer
    Description

    The minimum age of participants, in years.

  • Name
    maxAge
    Type
    integer
    Description

    The maximum age of participants, in years.

  • Name
    minParticipants
    Type
    integer
    Description

    How many participants the offer needs to take place.

  • Name
    maxParticipants
    Type
    integer
    Description

    How many participants the offer takes. Missing when unlimited.

  • Name
    vacancies
    Type
    integer
    Description

    Places left: maxParticipants minus confirmed and waitlisted attendances. Missing when places are unlimited, and with places=false.

  • Name
    fullyBooked
    Type
    boolean
    Description

    Whether no places are left. Missing with places=false.

  • Name
    requiresApplication
    Type
    boolean
    Description

    Whether participants have to apply. If not, they just turn up.

  • Name
    onlineApplication
    Type
    boolean
    Description

    Whether families can apply on the fepli website.

  • Name
    applicationDeadline
    Type
    timestamp
    Description

    The last moment to apply.

  • Name
    meetingPoint
    Type
    string
    Description

    A short label for where to meet, such as "Haupteingang Stadtpark".

  • Name
    meetingAddress
    Type
    string
    Description

    The street address of the meeting point.

  • Name
    meetingLat
    Type
    number
    Description

    The latitude of the meeting point (WGS 84).

  • Name
    meetingLng
    Type
    number
    Description

    The longitude of the meeting point (WGS 84).

  • Name
    bring
    Type
    string
    Description

    What participants should bring.

  • Name
    applyText
    Type
    string
    Description

    Extra information shown when applying, formatted as Markdown.

  • Name
    wheelchairAccessible
    Type
    boolean
    Description

    Whether the offer is wheelchair accessible.

  • Name
    accessibility
    Type
    string[]
    Description

    Further accessibility features.

  • Name
    categories
    Type
    reference[]
    Description

    The offer categories the offer is filed under.

  • Name
    url
    Type
    string
    Description

    The offer's page on the fepli website, where families apply.

  • Name
    media
    Type
    string[]
    Description

    Absolute URLs of the offer's images, scaled to at most 3000 × 3000 pixels. Where the tenant has the app Bilder über Bunny, they point to the hostname of its Pull Zone or the tenant's own hostname (https://<hostname>/<path>?width=…). On an installation set to original, they point to the file as uploaded (/storage/<tenant>/media/<path>?v=…). The URLs of an image are public.

  • Name
    thumbnails
    Type
    string[]
    Description

    The same images, cropped to 800 × 600 pixels: the size for a card or a list. The URLs take the same forms as in media.

  • Name
    createdAt
    Type
    timestamp
    Description

    When the offer was created.

  • Name
    modifiedAt
    Type
    timestamp
    Description

    When the offer was last changed.

  • Name
    publish
    Type
    string
    Access
    with a token
    Description

    public, or private_link for an offer that can only be reached through its private link.

  • Name
    comment
    Type
    string
    Access
    with a token
    Description

    An internal note, never shown publicly.

  • Name
    contact
    Type
    object[]
    Access
    with a token
    Description

    The contact persons for the offer's page on the fepli website, as entered: objects with name, email and phone.

  • Name
    collectDateOfBirth
    Type
    boolean
    Access
    with a token
    Description

    Whether the application form asks for the participant's date of birth.

  • Name
    disableOnlinePayment
    Type
    boolean
    Access
    with a token
    Description

    Whether online payment is switched off for this offer.

  • Name
    attendances
    Type
    object
    Access
    with a token
    Description

    How many attendances the offer has, by state: confirmed, waitlisted, waiting, withdrawn and rejected. total counts every attendance except withdrawn and unfulfilled ones.

  • Name
    applicationQuestions
    Type
    object[]
    Access
    with a token
    Description

    The extra questions the application form asks for this offer: first those of the offer's edition, then the offer's own. Each has a uuid, the question, its type (yn yes/no, int number, txt text, choice choice, file upload), whether it is required and whether it comes from the edition (season). Uploads list the accepted fileTypes (image, pdf). A choice lists its options, each with a label and a price in cents that is added to the fee; price is null for an option without a surcharge.

  • Name
    variantOf
    Type
    reference
    Access
    with a token
    Description

    The offer this one is a variant of, for example another date of the same course.

  • Name
    variants
    Type
    reference[]
    Access
    with a token
    Description

    The variants of this offer. Create one with POST /offers/{uuid}/variants.

  • Name
    transitions
    Type
    string[]
    Access
    with a token
    Description

    The workflow transitions you may apply right now.

The offer workflow

An offer moves through the same states as in the admin. A host user drafts it and submits it (finalize); admins review it (approve) and publish it (publish). Apply a transition with POST /offers/{uuid}/transition.

TransitionFromToWho may apply it
finalizedraftfinalizedanyone who can see the offer
to_draftfinalized or revieweddraftadmins; host users if the edition lets them publish
approvefinalized, unless completedreviewedadmins; host users if the edition lets them publish
unapprovereviewedfinalizedadmins; host users if the edition lets them publish
publishreviewedpublishedadmins; host users if the edition lets them publish
unpublishpublishedreviewedadmins; host users if the edition lets them publish
cancelpublished and not cancelled, before its last date has endedadds cancelledadmins; host users if the installation lets them edit their participant lists, their participant list is released and open, they are members of one of the offer's hosts, and they have signed the edition's confidentiality declaration, where it asks for one
relaunchcancelled, before its last date has endedpublishedas for cancel
completepublished, after its last date has endedadds completedadmins; host users who can see the offer

A completed offer can't be cancelled or relaunched any more. Where a host user may not apply cancel or relaunch, the offer's transitions leave it out.


GET/offers

List all offers

Returns a page of offers, ordered by their first date.

  • Without a token: the published, public offers of the editions that are online, with the public fields.
  • With a token: every offer you could open in the admin, in any state, with all fields. Admins see all offers; host users see their hosts' offers and offers shared with them. A token whose owner is neither an admin nor a member of a host sees no offers at all, not even the published ones: leave the token out to read those.

Optional filters

  • Name
    q
    Type
    string
    Description

    Only offers whose name contains this text.

  • Name
    edition
    Type
    string
    Description

    Only offers of this edition (UUID or alias).

  • Name
    key
    Type
    string
    Description

    A public key, for a page of another website. Without a token only.

  • Name
    places
    Type
    boolean
    Description

    false leaves out vacancies and fullyBooked. Without a token, fepli then caches the answer until an offer changes instead of for 30 seconds. Read the places from /offer-places.

  • Name
    host
    Type
    string
    Description

    Only offers of this host (UUID or alias).

  • Name
    category
    Type
    string
    Description

    Only offers in this offer category (UUID or alias).

  • Name
    status
    Type
    string
    Description

    Only offers in these states, comma-separated: draft, finalized, reviewed, published, cancelled, completed. published also matches offers that were cancelled after publication.

  • Name
    from
    Type
    date
    Description

    Only offers with a date that begins on or after this day.

  • Name
    until
    Type
    date
    Description

    Only offers with a date that begins on or before this day. Combined with from, an offer with several dates matches if one date is on or after from and one (not necessarily the same) is on or before until.

  • Name
    modifiedSince
    Type
    timestamp
    Description

    Only offers changed since this moment.

  • Name
    sort
    Type
    string
    Description

    begin (default, the first date), name, createdAt or modifiedAt.

  • Name
    order
    Type
    string
    Description

    asc (default) or desc.

  • Name
    page, itemsPerPage
    Type
    integer
    Description

    See Pagination.

GET/offers
curl -G https://example.fepli.eu/api/offers \
  -d edition=herbstferien-2026 \
  -d from=2026-10-12

Response

[
  {
    "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,
    "currency": "EUR",
    "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}

Retrieve an offer

Returns one offer. The same visibility rules apply as for the list: without a token, only a published, public offer of an online edition can be retrieved. Anything else is a 404.

A page of another website passes its public key as key, as on the list. places=false leaves out the places, as on the list.

With a token, the offer includes the internal fields, among them the attendance counts and the transitions you may apply.

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

Response (with a token, excerpt)

{
  "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"]
}

GET/offer-places

List the free places

Returns the free places of the offers, and nothing else: one entry per offer that /offers returns to the same caller, with the same filters and the same visibility rules. Not paginated.

The places change with every application, the rest of an offer rarely. Without a token, fepli caches this answer for 5 seconds. Read the offers with places=false, which fepli caches until an offer changes, and the places from here. The embeds do so.

Optional filters

The filters of /offers apply, except places, sort, order, page and itemsPerPage: q, edition, host, category, status, from, until, modifiedSince and key. Any other parameter is a 400.

  • Name
    edition
    Type
    string
    Description

    Only offers of this edition (UUID or alias).

  • Name
    key
    Type
    string
    Description

    A public key, for a page of another website. Without a token only.

Fields

  • Name
    uuid
    Type
    string
    Description

    The offer.

  • Name
    vacancies
    Type
    integer
    Description

    Places left, as on the offer. Missing when places are unlimited.

  • Name
    fullyBooked
    Type
    boolean
    Description

    Whether no places are left.

  • Name
    waiting
    Type
    integer
    Description

    How many attendances wait on the waiting list.

GET/offer-places
curl -G https://example.fepli.eu/api/offer-places \
  -d edition=herbstferien-2026

Response

[
  {
    "uuid": "0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b01",
    "vacancies": 1,
    "fullyBooked": false,
    "waiting": 0
  },
  {
    "uuid": "0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b02",
    "vacancies": 0,
    "fullyBooked": true,
    "waiting": 3
  }
]

POST/offers

Create an offer

Creates an offer in the state draft. Admins can create offers in any edition. Host users can create them for their own hosts, in editions whose host_editing_stage task is active.

When a person creates the offer, they get the e-mails that link to its participant list before the event (manual). The API neither shows nor sets who gets those e-mails; that is chosen in the admin, under Listen-Empfänger:innen. When a host user is a member of exactly one host, that host is added automatically.

Without contact, the offer takes its contact from the profile of its first host: the host's name, e-mail address and phone number. A host whose profile has neither an e-mail address nor a phone number leaves the offer without a contact, and so does an offer without hosts. Send contact to name other contact persons, or [] for none.

Required attributes

  • Name
    name
    Type
    string
    Description

    The title of the offer.

  • Name
    edition
    Type
    string
    Description

    The edition, as UUID or alias. Host users must name one; without it the answer is 403.

Optional attributes

  • Name
    hosts
    Type
    string[]
    Description

    Hosts, as UUIDs or aliases. Host users may only name their own.

  • Name
    dates
    Type
    object[]
    Description

    Dates, each with begin, and optionally end and recurrence.

  • Name
    categories
    Type
    string[]
    Description

    Offer categories, as UUIDs or aliases.

  • Name
    publish
    Type
    string
    Description

    public (the default), or private_link for an offer that can only be reached through its private link.

  • Name
    contact
    Type
    object[]
    Description

    Contact persons: objects with name, email and phone. Defaults to the contact details of the first host's profile.

You can also send teaser, description, fee, minAge, maxAge, minParticipants, maxParticipants, requiresApplication, onlineApplication, applicationDeadline, meetingPoint, meetingAddress, meetingLat, meetingLng, bring, applyText, wheelchairAccessible, accessibility, comment, collectDateOfBirth and disableOnlinePayment, as described in the model.

Ages range from 0 to 99, fees and participant numbers can't be negative, and short texts such as meetingPoint, bring, applyText and comment are limited to 255 characters.

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"]
  }'

Response (201 Created, excerpt)

{
  "uuid": "0193c8a2-5d6e-7f70-9a8b-1c2d3e4f5a14",
  "name": "Töpfern für Anfänger",
  "alias": "toepfern-fuer-anfaenger",
  "status": ["draft"],
  "…": "…",
  "transitions": ["finalize"]
}

PATCH/offers/{uuid}

Update an offer

Changes an offer. Send only the attributes you want to change. The attributes are the same as for creating an offer. null clears a field, except for name, edition, hosts, dates, categories, publish and the yes/no fields, which ignore it. An empty body is a 422.

Dates are replaced as a whole when you send dates. To keep an existing date, include its uuid; dates you leave out are deleted, and dates without a uuid are added.

Admins can change any offer. Host users can change their offers until they are reviewed or published, and only while the edition is open for editing (see the edition's editableForHosts). Otherwise the answer is 403.

Host users cannot change who runs an offer: hosts must name the same hosts as before, in any order, or the answer is 403. A change of edition needs the permission to create offers in the new edition, as for creating an offer; otherwise the answer is 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" }
    ]
  }'

The response holds the changed offer.


DELETE/offers/{uuid}

Delete an offer

Deletes an offer with its attendances. Responds with 204 No Content.

The deletion is refused with 409 while a paid receipt refers to one of the offer's attendances. Reverse the receipt first, or cancel the offer instead. Host users can only delete offers that are neither reviewed nor published and have no attendances yet, and only while the edition is open for editing (see the edition's editableForHosts).

If the offer has variants, the next one takes its place as the main offer.

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

Apply a transition

Moves the offer through its workflow. The offer's transitions list the ones you may apply right now. Anything else, including a transition you lack the permission for, is a 409 that names the possible transitions.

cancel and relaunch e-mail the families with a place when you pass a notifyText, the same as in the admin. Without one, nobody is e-mailed.

Required attributes

  • Name
    transition
    Type
    string
    Description

    One of finalize, to_draft, approve, unapprove, publish, unpublish, cancel, relaunch, complete.

Optional attributes

  • Name
    notifyText
    Type
    string
    Description

    For cancel and relaunch: the text of the e-mail to the families with a place. Leave it out and no e-mail goes out.

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."
  }'

Response (excerpt)

{
  "uuid": "0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03",
  "status": ["published", "cancelled"],
  "…": "…",
  "transitions": ["relaunch", "unpublish"]
}

POST/offers/{uuid}/copy

Copy an offer

Copies an offer into a new offer in the state draft, like Angebot kopieren in the admin. Responds with 201 Created and the copy. The original is left as it is.

Without edition, the copy is made in the offer's own edition, dates included. With edition, it is made in that edition, and the dates and the application deadline stay behind: they belonged to the old holidays. Add the new ones with PATCH /offers/{uuid}. This also applies when you name the offer's own edition.

You need to see the original (404 otherwise) and be allowed to create an offer in the edition the copy lands in: admins always are, host users while that edition's host_editing_stage task is active (403 otherwise). An edition that doesn't exist is a 422.

What a copy carries over

The copy takes the texts and settings of the original: name, teaser, description, fee, ages, participant numbers, the settings for applying and the application questions, meeting point, what to bring, accessibility, offer categories, hosts, contact persons, the accounts that get the e-mails about the participant list, the internal comment, publish and consent forms. Images and attachments are carried over too; the copy refers to the same files.

It doesn't take what the original has gathered: attendances, comments, the history, variants, and the accounts the offer was shared with directly. A copy is always an offer of its own, even when the original is a variant. It gets a new uuid and its own private link. Its createdAt and modifiedAt are the moment of the copy.

Optional attributes

  • Name
    edition
    Type
    string
    Description

    The edition to copy into, as UUID or alias. Leave it out to copy within the offer's own edition, dates included.

The request needs a JSON body: send {} to copy within the edition.

Copying a whole edition

There is no call for that. List the offers with GET /offers?edition=… and copy each into the new edition. The admin's Aus Vorjahr kopieren leaves out the variants (offers with variantOf), so they don't turn into offers of their own; do the same if you want its result.

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"}'

Response (201 Created, excerpt)

{
  "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,
  "currency": "EUR",
  "…": "…",
  "attendances": {
    "confirmed": 0,
    "waitlisted": 0,
    "waiting": 0,
    "withdrawn": 0,
    "rejected": 0,
    "total": 0
  },
  "transitions": ["finalize"]
}

POST/offers/{uuid}/variants

Create a variant

Creates a variant of an offer: the same activity for another group of participants, usually on other dates. Like Neuen Termin erstellen in the admin. Responds with 201 Created and the new variant.

A variant is a copy in the state draft, in the same edition and with the same dates, that is linked to the main offer: its variantOf names the main offer, and the main offer lists it in variants. Change its dates with PATCH /offers/{uuid}. A variant of a variant is linked to the same main offer.

The request has no body. The same permissions apply as for a copy: 404 if you can't see the offer, 403 if you may not create an offer in its edition.

POST/offers/{uuid}/variants
curl -X POST https://example.fepli.eu/api/offers/0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03/variants \
  -H "Authorization: Bearer $FEPLI_TOKEN"

Response (201 Created, excerpt)

{
  "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

Refill from the waitlist

Fills the free places of an offer from its waitlist, like Teilnahmeliste auffüllen in the admin. Families move up in the order of the waitlist (first come, first served), whatever application system the edition uses. Each family that moves up is confirmed, and its fee falls due as for any confirmation.

The work is done in the background, shortly after the call. The API answers 202 Accepted with the offer as it is at that moment; fetch its participant list a little later to see who moved up.

To add places, raise maxParticipants with PATCH /offers/{uuid}, then call this endpoint. That is what Anzahl Plätze erhöhen does in the admin.

The call is refused with 409 when there is nothing to do: the offer has no dates or its first date has begun, nobody is on the waitlist, or every place is taken. It needs the permission to change the offer: admins always have it; host users only until the offer is reviewed or published, while the edition is open for editing (403 otherwise).

Optional attributes

The request needs a JSON body: send {} for the defaults.

  • Name
    notify
    Type
    boolean
    Description

    E-mail the families who move up that they have a place. Defaults to false.

  • Name
    commit
    Type
    boolean
    Description

    Record the confirmations now. Defaults to true. With false, they are held back until the edition's decisions are committed; notify then has to be false too (422 otherwise).

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}'

Response (202 Accepted, excerpt)

{
  "uuid": "0192a4f1-6e3b-7c85-b1d2-8f4e6a9c3b03",
  "maxParticipants": 18,
  "…": "…",
  "attendances": {
    "confirmed": 15,
    "waitlisted": 5,
    "waiting": 0,
    "withdrawn": 1,
    "rejected": 0,
    "total": 20
  }
}

Was this page helpful?