API

Dieses Kapitel richtet sich an Entwickler und setzt Programmiererfahrung voraus.

Eine Reihe von Funktionen in MemberOrganizer wird über eine API bereitgestellt. Damit ist es möglich, Integrationen mit MemberOrganizer aus anderen Systemen heraus zu erstellen. Im Folgenden werden „andere Systeme“ als Client bezeichnet.

Lesen Sie den Inhalt dieses Kapitels sorgfältig, einschließlich der unten beschriebenen Einschränkungen und Haftung, um allgemeine Restriktionen zu verstehen.

Wenn MemberOrganizer feststellt, dass Sie die Nutzungsbedingungen der API verletzt haben oder zu verletzen versucht haben, kann Ihr Zugang zur API vorübergehend oder dauerhaft widerrufen werden.

Sicherheit und Authentifizierung

Um auf die API zugreifen zu dürfen, muss sich der Client, der mit foreninglet.dk integrieren möchte, zuerst mit Benutzername und Passwort anmelden. Dies geschieht über HTTP Basic Authentication, was beispielsweise mit dem Kommandozeilenwerkzeug curl wie folgt erfolgen kann:

curl https://foreninglet.dk/api/members?version=1 -u {Benutzername}:{Passwort}

Der Parameter version ist obligatorisch und gibt an, auf welche Version der API zugegriffen wird. Die aktuelle Version ist 1.

Der Parameter nach -u ist Benutzername und Passwort, getrennt durch einen Doppelpunkt. Benutzername und Passwort können vom Administrator des Vereins unter „Konfiguration -> Integrationen -> API“ eingesehen werden.

Das Passwort (in Kombination mit dem Benutzernamen) gewährt Zugang zu den Daten des Vereins, weshalb das Passwort nicht an Dritte weitergegeben werden darf, da Dritte dadurch Zugang zu den Daten des Vereins erhalten könnten.

Die URL https://foreninglet.dk/api/members?version=1 kann auch in einen Browser eingegeben werden, woraufhin der Browser nach Benutzername und Passwort fragt. So lässt sich die API leicht testen.

Versionierung

Der Client muss bei jeder Anfrage immer den URL-Parameter version angeben. Damit wird sichergestellt, dass die API fortlaufend erweitert werden kann, ohne den Vertrag mit bestehenden Clients zu brechen, da eine gegebene Version niemals Benennungen ändert oder ein Feld in den Antworten entfernt, die die API an den Client zurückgibt.

Wenn Änderungen an der API vorgenommen werden, geschieht dies immer durch Hinzufügen einer neuen Version der API, sodass Clients, die nicht auf der neuesten Version laufen, weiterhin funktionieren.

Wenn eine ältere Version der API ausläuft, werden die Vereine, die diese Version der API nutzen, in angemessener Zeit benachrichtigt. Typischerweise kann ein Verein einfach auf die neueste Version der API wechseln, ohne Codeänderungen im Client vornehmen zu müssen.

Anfragenlimits

Es gibt eine Obergrenze dafür, wie viele Anfragen Sie pro Stunde an die API stellen dürfen. Die Grenze beträgt 10.000 Anfragen pro Stunde.

Wenn die Grenze überschritten wird, antwortet die API mit HTTP 429 („Too Many Requests“).

Protokoll und Datenformat

Die Integration erfolgt über das https-Protokoll. Die API basiert auf REST-Prinzipien.

Das Datenformat ist json. Wenn ein Client eine Antwort in einem anderen Format wünscht, z. B. html (oder xml), fügen Sie der Anfrage folgende URL-Parameter hinzu: /format/html. Beispiel: https://foreninglet.dk/api/members/format/html?version=1

Beim Anlegen neuer Daten (POST) oder Aktualisieren bestehender Daten (PUT) muss in der Anfrage immer „Content-Type: application/json“ angegeben werden.

Zeitstempel folgen ISO8601 und werden immer in UTC angezeigt.

Wenn eine Ressource angelegt oder aktualisiert wird, befindet sich die Antwort im body im json-Format, und es wird ein Location-http-Header gesetzt, der auf die Ressource verweist.

Einschränkungen und Haftung

Ihr Abonnement bei MemberOrganizer ermöglicht den Zugang zur Nutzung einer API, einschließlich der Entwicklung und Implementierung von Integrationen zur Nutzung im Zusammenhang mit Ihrem Abonnement bei MemberOrganizer für Ihre internen Geschäftszwecke.

Um die API nutzen und darauf zugreifen zu können, müssen Sie API-Benutzername und -Passwort verwenden, die verfügbar sind, wenn Sie in MemberOrganizer angelegt sind. Sie dürfen diesen Benutzernamen und dieses Passwort nicht weitergeben und müssen sie sicher aufbewahren. Benutzername und Passwort sind der einzige Weg, über den Sie die Erlaubnis haben, auf die API zuzugreifen.

Sie dürfen die API nicht nutzen, um Produkte oder Dienstleistungen zu kopieren, die von MemberOrganizer angeboten werden, einschließlich Funktionen oder Clients auf Plattformen (wie iOS oder Android), auf denen MemberOrganizer einen eigenen Client oder eine eigene Funktion anbietet.

Sie dürfen die API nicht weiterverkaufen. Sie dürfen die API in keiner Weise nutzen, die die Sicherheit der API potenziell untergraben könnte.

Sie tragen die alleinige Verantwortung (und MemberOrganizer übernimmt keinerlei Haftung) für Inhalt, Entwicklung, Betrieb oder Wartung der Integrationen, die Sie über die API entwickeln. Sie tragen die alleinige Verantwortung dafür, dass Ihre Integrationen keine Rechte des geistigen Eigentums Dritter verletzen oder beeinträchtigen.

Sie müssen die technischen und richtlinienmäßig implementierten Einschränkungen der API respektieren und einhalten.

Soweit Sie Integrationen entwickeln oder implementieren, die Daten über die API außerhalb von MemberOrganizer senden oder anderweitig nutzen, sind Sie für erforderliche Anmeldungen bei oder Einwilligungen von Endnutzern verantwortlich, dass deren Daten außerhalb von MemberOrganizer gesendet werden. MemberOrganizer ist nicht verantwortlich für Sicherheit oder Integrität Ihrer Daten, soweit diese über Ihre Integrationen zur API außerhalb von MemberOrganizer gesendet werden.

API-Aufrufe

Im Folgenden eine Liste der verschiedenen Aufrufe der API.

Mitgliederliste

GET /api/members

Der folgende Aufruf gibt alle eingeschriebenen Mitglieder zurück

curl https://foreninglet.dk/api/members?version=1 -u {Benutzername}:{Passwort}

Wenn Sie eine Liste aller ausgetretenen Mitglieder wünschen, geht das wie folgt:

curl https://foreninglet.dk/api/members/status/resigned?version=1 -u {Benutzername}:{Passwort}

Mitglied anlegen

POST /api/member

Beim Anlegen eines Mitglieds müssen Sie mindestens einen Vornamen angeben.

Beispielanfrage

{
  "member": {
    "first_name": "Hans Christian",
    "last_name": "Andersen"
  }
}

Via curl

curl https://foreninglet.dk/api/member?version=1 \
  -d '{"member": {"first_name": "Hans Christian","last_name": "Andersen"}}' \
  -H "Content-Type: application/json" -u {Benutzername}:{Passwort} -X POST

Beispielantwort

HTTP/1.1 201 Created
Location: https://foreninglet.dk/api/member/id/1?version=1
Content-Type: application/json

{
  "member": {
    "id": 12345,
    "display_id": 1,
    "first_name": "Hans Christian",
    "last_name": "Andersen",
    "address": "",
    "address2": "",
    "zip": "",
    "city": "",
    "email": "",
    "email2": "",
    "email3": "",
    "phone": "",
    "mobile": "",
    "gender": 2,
    "birthday": "0000-00-00",
    "country_code": "",
    "ean_number": "",
    "enrollment": "0000-00-00",
    "resignation_date": "0000-00-00",
    "password": "63C4B",
    "field1": "",
    "field2": "",
    "field3": "",
    "field4": "",
    "field5": "",
    "field6": "",
    "field7": "",
    "field8": "",
    "field9": "",
    "field10": "",
    "created": "2015-06-18T12:02:14+0000",
    "updated": "2015-06-18T12:02:14+0000",
    "activity_ids": [],
    "cpr_number": "",
    "reg_number": "",
    "account_number": ""
  }
}

Das System weist neuen Mitgliedern automatisch ein Passwort zu. Sie können beim Anlegen auch ein Passwort angeben.

Parameter

Beim Anlegen eines neuen Mitglieds über POST können folgende Parameter angegeben werden, wobei first_name der einzige obligatorische Parameter ist.

Name

Beschreibung

display_id

Mitgliedsnummer

first_name

Vorname

last_name

Nachname

address

Adresse

address2

Adresse 2

zip

Postleitzahl

city

Ort

email

E-Mail-Adresse

email2

E-Mail-Adresse 2

email3

E-Mail-Adresse 3

phone

Telefonnummer

mobile

Mobilnummer

gender

Geschlecht (0=weiblich, 1=männlich, 2=kein Geschlecht angegeben)

birthday

Geburtsdatum

country_code

Ländercode (ISO 3166 - 2 Buchstaben)

ean_number

EAN-Nummer

enrollment

Einschreibedatum

resignation_date

Austrittsdatum

password

Passwort

field1

Feld 1

field2

Feld 2

field3

Feld 3

field4

Feld 4

field5

Feld 5

field6

Feld 6

field7

Feld 7

field8

Feld 8

field9

Feld 9

field10

Feld 10

activity_ids

Aktivitäts-IDs

cpr_number

CPR-Nummer

reg_number

Bankleitzahl

account_number

Bankkontonummer

Wenn keine Mitgliedsnummer angegeben wird, vergibt das System selbst die nächste freie Mitgliedsnummer.

Bemerkung

Betalingsservice: Wenn die Felder CPR-Nummer, Bankleitzahl und Bankkontonummer ausgefüllt sind und der Verein für Betalingsservice eingerichtet ist, versucht das System automatisch, eine PBS-Vereinbarung für das neue Mitglied anzulegen.

Mitglied aktualisieren

PUT /api/member/id/{id}

Beim Aktualisieren eines Mitglieds müssen Sie die ID des zu aktualisierenden Mitglieds angeben. Mitglieds-IDs werden vom API-Aufruf zur Mitgliederliste zurückgegeben. Beachten Sie, dass die Felder id und display_id zwei verschiedene Felder sind, wobei id die interne Datenbanknummer ist, die für das Mitglied eindeutig ist und in API-Aufrufen verwendet wird, während display_id der Mitgliedsnummer des Mitglieds entspricht.

Sie müssen nur die Felder angeben, die Sie ändern möchten.

Beachten Sie, dass bei Angabe einer leeren Liste von Aktivitäts-IDs eventuell zugewiesene Aktivitäten des Mitglieds gelöscht werden. Wenn Sie die Aktivitäten des Mitglieds nicht beeinflussen möchten, müssen Sie das Feld activity_ids vollständig weglassen. Sobald das Feld activity_ids gesetzt ist, wird die gesamte Aktivitätenliste des Mitglieds so aktualisiert, dass sie genau die angegebenen Aktivitäten enthält. Aktivitäten können daher auch gelöscht werden.

Beispielanfrage

{
  "member": {
    "first_name": "Hans Christian",
    "last_name": "Jensen"
  }
}

Via curl

curl https://foreninglet.dk/api/member/id/{id}?version=1 \
  -d '{"member": {"first_name": "Hans Christian","last_name": "Jensen"}}' \
  -H "Content-Type: application/json" -u {Benutzername}:{Passwort} -X PUT

Beispielantwort

HTTP/1.1 200 OK
Content-Type: application/json

{
  "member": {
    "id": 12345,
    "display_id": 122153,
    "first_name": "Hans Christian",
    "last_name": "Jensen",
    "address": "",
    "address2": "",
    "zip": "",
    "city": "",
    "email": "",
    "email2": "",
    "email3": "",
    "phone": "",
    "mobile": "",
    "gender": 2,
    "birthday": "0000-00-00",
    "country_code": "",
    "ean_number": "",
    "enrollment": "0000-00-00",
    "resignation_date": "0000-00-00",
    "password": "63C4B",
    "field1": "",
    "field2": "",
    "field3": "",
    "field4": "",
    "field5": "",
    "field6": "",
    "field7": "",
    "field8": "",
    "field9": "",
    "field10": "",
    "created": "2015-06-18T12:02:14+0000",
    "updated": "2015-06-18T12:02:16+0000",
    "activity_ids": []
  }
}

Login

POST /api/memberlogin

Wenn Sie ein Login für ein Mitglied durchführen möchten, müssen Sie einen Benutzernamen und ein Passwort angeben. Der Benutzername kann Mitgliedsnummer oder E-Mail-Adresse sein, gesteuert über den Parameter field, der standardmäßig auf email gesetzt ist. Die andere Möglichkeit ist member_number.

Wenn das Mitglied den Status „eingeschrieben“ hat und Benutzername und Passwort übereinstimmen, werden die Mitgliedsdaten zurückgegeben.

Im Folgenden ein Beispiel für Login mit E-Mail-Adresse test@foreninglet.dk und Passwort 12345.

Beispielanfrage

{
  "credentials": {
    "username": "test@foreninglet.dk",
    "password": "12345",
    "field": "email"
  }
}

Via curl

curl https://foreninglet.dk/api/memberlogin?version=1 \
  -d '{"credentials": {"username": "test@foreninglet.dk","password": "12345", "field": "email"}}' \
  -H "Content-Type: application/json" -u {Benutzername}:{Passwort} -X POST

Beispielantwort

HTTP/1.1 200 OK
Content-Type: application/json

{
    "id": 12345,
    "display_id": 1000,
    "first_name": "Hans",
    "last_name": "Jensen",
    "address": "",
    "address2": "",
    "zip": "",
    "city": "",
    "email": "test@foreninglet.dk",
    "password": "12345"
}

Die obige Antwort ist nur ein Auszug der zurückgegebenen Mitgliedsinformationen, wenn das Mitglied gefunden wird. Es wird z. B. auch eine Liste der Aktivitäten zurückgegeben, denen das Mitglied zugeordnet ist. Dies ist ein Feld namens activity_ids, das eine Liste von Aktivitäts-IDs enthält.

Wenn das Mitglied nicht gefunden wird, wird folgende Antwort zurückgegeben:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
        "error":"Member with username [test@foreninglet.dk] could not be found"
}

Mitglied hat Zutritt

GET /api/memberhasaccess?version=1&member_id=12345&door_number=1

Gibt an, ob ein Mitglied Zutritt zu einer Tür/einem Zugangspunkt hat. Dieser Aufruf wird typischerweise im Zusammenhang mit einem externen Zutrittskontrollsystem verwendet. Beachten Sie, dass MemberOrganizer ein vollständig integriertes Zutrittskontrollsystem anbietet, sodass dieser API-Aufruf nur verwendet werden sollte, wenn Sie sehr spezielle Anforderungen an die Zutrittskontrolle haben. Ein Beispiel könnte der Wunsch sein, Gesichtserkennung zu nutzen, was nicht direkt in MemberOrganizers eigenes Zutrittskontrollsystem eingebaut ist, aber über ein Drittanbietersystem implementiert werden kann, das diesen API-Aufruf nutzt.

Via curl

curl https://foreninglet.dk/api/memberhasaccess?version=1&member_id=12345&door_number=1

Beispielantwort

HTTP/1.1 200 OK
Content-Type: application/json

{
        "has_access":true,
        "message":"",
        "error_message":""
}

Wenn das Mitglied keinen Zutritt hat, ist has_access false. Das kann z. B. daran liegen, dass das Mitglied ausgetreten ist oder den Mitgliedsbeitrag nicht bezahlt hat.

Aktivitätsliste

GET /api/activities

Der folgende Aufruf gibt alle Aktivitäten zurück

curl https://foreninglet.dk/api/activities?version=1 -u {Benutzername}:{Passwort}

Beispielantwort

HTTP/1.1 200 OK
Content-Type: application/json

[
    {
        "ActivityId": "11111",
        "Categories": ["Jugendabteilung"],
        "ExternalDescriptions": [],
        "Name": "Jugendbeitrag",
        "OnlineEnrollmentEnabled": "0",
        "SettlementDate": "0000-00-00T00:00:00+0000"
    },
    {
        "ActivityId": "22222",
        "Categories": ["Seniorenabteilung"],
        "ExternalDescriptions": [],
        "Name": "Seniorenbeitrag",
        "OnlineEnrollmentEnabled": "0",
        "SettlementDate": "0000-00-00T00:00:00+0000"
    },
    {
        "ActivityId": "33333",
        "ExternalDescriptions": [
            {
                "Headline": "Anmeldung öffnet",
                "Text": "1. August 2025, um 12:00 Uhr"
            },
            {
                "Headline": "Anmeldung schließt",
                "Text": "25. Juli 2025, um 13:00 Uhr"
            }
        ],
        "Name": "Sommercap",
        "OnlineEnrollmentEnabled": "1",
        "SettlementDate": "2025-08-01T10:00:00+0000",
        "CloseDate": "2025-07-25T15:00:00+0000"
    }
]

Das obige Beispiel zeigt eine Antwort mit 3 Aktivitäten. Eine der Aktivitäten ist für die Online-Anmeldung geöffnet, erkennbar am Feld OnlineEnrollmentEnabled, dessen Wert auf 1 gesetzt ist. Wenn eine Aktivität für die Online-Anmeldung geöffnet ist, sind im Feld ExternalDescriptions auch Beschreibungen der Aktivität ausgefüllt — eine Liste mit Überschriften und Texten.

Wenn Sie die Aktivitätsliste nutzen möchten, um eine Anmeldeliste auf Ihrer eigenen Website zu erstellen, können Sie ActivityID verwenden, um von dieser Liste auf der Website tief in das Mitgliederportal zu verlinken, z. B. so:

https://<Vereins-ID>.foreninglet.dk/memberportal/teamenrollment/subscribe/<ActivityID>

Sie müssen natürlich Vereins-ID und ActivityID durch die richtigen Werte ersetzen. Die Vereins-ID ist im System sichtbar, wenn Sie angemeldet sind, indem Sie auf den Menüpunkt „Mitgliederportal“ klicken.

Rechnung anlegen

POST /api/invoice

Beim Anlegen einer Rechnung müssen Sie mindestens die Mitglieds-ID angeben (beachten Sie, dass Mitglieds-ID nicht dasselbe ist wie Mitgliedsnummer), eine Beschreibung dessen, was in Rechnung gestellt wird, sowie den zu berechnenden Betrag.

Beispielanfrage mit Kartenzahlung

{
  "invoice": {
    "member_id": 123456,
    "description": "Mitgliedsbeitrag",
    "amount": 100.00
  }
}

Via curl

curl https://foreninglet.dk/api/invoice?version=1 \
  -d '{"invoice": {"member_id": 123456, "description": "Mitgliedsbeitrag", "amount": 100.00}}' \
  -H "Content-Type: application/json" -u {Benutzername}:{Passwort} -X POST

Beispielantwort

HTTP/1.1 201 Created
Location: https://foreninglet.dk/api/invoice/id/1000?version=1
Content-Type: application/json

{
  "invoice": {
    "credit_card_payment_url": "https://foreninglet.dk/main/apiredirectcreditcardwindow/{x}",
    "id": 1000,
    "text": "Mitgliedsbeitrag",
    "total_amount": 100
  }
}

Das System vergibt automatisch eine Rechnungsnummer für eine neue Rechnung. Sie befindet sich im Feld „id“.

In der Antwort gibt es einen wichtigen Parameter namens credit_card_payment_url, der eine Adresse enthält. Wenn Sie zu dieser Adresse weiterleiten, öffnet sich ein Zahlungsfenster, in dem das Mitglied die Rechnung mit einer Zahlungskarte bezahlen kann. Voraussetzung ist natürlich, dass Kartenzahlung erworben und eingerichtet ist.

Beispielanfrage mit Zahlung über MobilePay wiederkehrende Zahlung

Neben Kartenzahlung kann das System auch zu einem MobilePay-Zahlungsfenster weiterleiten. Voraussetzung dafür ist, dass MobilePay wiederkehrende Zahlung im System im Voraus eingerichtet ist. Wenn aus dem API-Aufruf ein MobilePay-Zahlungslink zurückkommen soll, müssen Sie gegenüber dem Beispiel mit Kartenzahlung einen zusätzlichen Parameter angeben, nämlich den Parameter namens „payment_method“, der auf „MobilePayRecurring“ gesetzt werden muss, wie im folgenden Beispiel gezeigt:

{
  "invoice": {
    "member_id": 123456,
    "description": "Mitgliedsbeitrag",
    "amount": 100.00,
    "payment_method": "MobilePayRecurring"
  }
}

Via curl

curl https://foreninglet.dk/api/invoice?version=1 \
  -d '{"invoice": {"member_id": 123456, "description": "Mitgliedsbeitrag", "amount": 100.00, "payment_method": "MobilePayRecurring"}}' \
  -H "Content-Type: application/json" -u {Benutzername}:{Passwort} -X POST

Beispielantwort

HTTP/1.1 201 Created
Location: https://foreninglet.dk/api/invoice/id/1000?version=1
Content-Type: application/json

{
  "invoice": {
    "mobilepay_payment_url": "https://foreninglet.dk/main/apiredirectmobilepayrecurringwindow/{x}",
    "id": 1000,
    "text": "Mitgliedsbeitrag",
    "total_amount": 100
  }
}

Buchung anlegen

POST /api/booking

Beim Anlegen einer Buchung müssen Sie mindestens die ID des Ressourcenkalenders angeben, in dem gebucht wird, und die ID der Ressource, die die Buchung betrifft, sowie Start- und Enddatum und entweder einen Text oder eine Liste von Mitglieds-IDs.

Beispielanfrage

{
  "booking": {
    "resource_calendar": 5678,
    "resource_id": 1234,
    "text": "Generalversammlung",
    "start_date": "2017-11-14T18:00:00+0000",
    "end_date": "2017-11-14T20:00:00+0000",
    "create_timed_code": "true"
  }
}

Via curl

curl https://foreninglet.dk/api/booking?version=1 \
  -d '{"booking": {"resource_calendar_id": 5678, "resource_id": 1234, "text": "Generalversammlung", "start_date": "2017-11-14T18:00:00+0000", "end_date": "2017-11-14T20:00:00+0000", "create_timed_code": "true"}}' \
  -H "Content-Type: application/json" -u {Benutzername}:{Passwort} -X POST

Beispielantwort

HTTP/1.1 201 Created
Location: https://foreninglet.dk/api/booking/id/1000?version=1
Content-Type: application/json

{
  "booking": {
    "id": 1000,
    "resource_calendar_id": 5678,
    "resource_id": 1234,
    "text": "Generalversammlung",
    "start_date": "2017-11-14T18:00:00+0000",
    "end_date": "2017-11-14T20:00:00+0000",
    "created": "2017-11-07T16:42:14+0000",
    "timed_code": 476294
  }
}

Das System vergibt automatisch eine Buchungs-ID für eine neue Buchung. Sie befindet sich im Feld „id“.

Wenn Sie „create_timed_code“ auf „true“ gesetzt haben, erzeugt das System einen 6-stelligen Code, der im Türsystem (falls installiert) verwendet werden kann und Zutritt zur Buchung im Zeitraum um Start- und Endzeit der Buchung gewährt.

Der Ressourcenkalender definiert Regeln für die in den Kalender einbezogenen Ressourcen. Ein Ressourcenkalender enthält typischerweise eine bis mehrere Ressourcen. Bei der Buchung von Badmintonplätzen entspricht ein Ressourcenkalender typischerweise einer Halle, und die Ressourcen sind die Plätze in der Halle.

Buchung löschen

DELETE /api/booking/id/{id}

Beim Löschen einer Buchung müssen Sie die ID der zu löschenden Buchung angeben.

Via curl

curl https://foreninglet.dk/api/booking/id/1234?version=1 \
  -H "Content-Type: application/json" -u {Benutzername}:{Passwort} -X DELETE

Beispielantwort

HTTP/1.1 200 OK
Content-Type: application/json

{"id":"1234","message":"DELETED!"}

Das System löscht auch einen eventuellen Code für das Türsystem, wenn ein solcher Code mit der Buchung verknüpft ist.

Buchungsliste

GET /api/bookings/start_date/{Startdatum}/end_date/{Enddatum}

Das Datumsformat muss JJJJ-MM-TT sein — z. B. 2018-12-24, Heiligabend.

Beim Abrufen einer Buchungsliste müssen Sie mindestens Start- und Enddatum angeben, wie oben gezeigt. Das System gibt alle Buchungen zurück, die innerhalb des angegebenen Datumsintervalls liegen aus dem ersten Ressourcenkalender. Es werden also immer Buchungen nur aus einem Ressourcenkalender auf einmal abgerufen. Wenn Sie Buchungen aus einem anderen Ressourcenkalender abrufen möchten, müssen Sie einen zusätzlichen Parameter namens resource_calendar_id im Aufruf angeben und diesen Parameter auf die ID des Ressourcenkalenders setzen, aus dem Sie Buchungen abrufen möchten.

Via curl

curl https://foreninglet.dk/api/bookings/start_date/{Startdatum}/end_date/{Enddatum}?version=1 -u {Benutzername}:{Passwort}

Beispielantwort

HTTP/1.1 200 OK
Content-Type: application/json

[
    {
        "activity_id": "0",
        "created": "2017-02-27T10:56:12+0000",
        "created_by": "admin",
        "end_time": "2017-12-01T13:00:00+0000",
        "id": "99128",
        "resource_id": "1234",
        "start_time": "2017-12-01T11:00:00+0000",
        "text": "Buchung Platz 1",
        "url": ""
    },
    {
        "activity_id": "0",
        "created": "2017-07-31T21:13:52+0000",
        "created_by": "admin",
        "end_time": "2017-12-01T19:00:00+0000",
        "id": "124282",
        "resource_id": "1235",
        "start_time": "2017-12-01T15:00:00+0000",
        "text": "Buchung Platz 2",
        "url": ""
    }
]

Beachten Sie, dass start_time und end_time in der obigen Antwort in UTC angegeben sind.

Informationen zum Ressourcenkalender

GET /api/bookings/resourcecalendar/id/{id}

Beim Abrufen von Informationen zu einem Ressourcenkalender müssen Sie die ID des Ressourcenkalenders angeben, wie oben gezeigt. Der Verein kann die IDs der zu verwendenden Ressourcenkalender mitteilen.

Das System gibt Informationen zum Ressourcenkalender zurück, und diese Informationen können — in Kombination mit bereits gebuchten Zeiten — genutzt werden, wenn Sie freie Zeiten in einem externen System anzeigen möchten. Das könnte z. B. ein System wie Wannasport (https://www.wannasport.dk) sein, das mit MemberOrganizer integriert.

Via curl

curl https://foreninglet.dk/api/resourcecalendar/id/{id}?version=1 -u {Benutzername}:{Passwort}

Beispielantwort

HTTP/1.1 200 OK
Content-Type: application/json

{
    "close_days": [
        "24-12-2020: Geschlossen wegen Heiligabend",
        "31-12-2020: Geschlossen wegen Silvester"
    ],
    "description": "",
    "duration": "60",
    "end_date": "2020-12-31",
    "end_time": "23:00",
    "id": "1111",
    "name": "Platzübersicht",
    "rule_max_days_ahead": "14",
    "selected_days": "1,2,3,4,5,6,7",
    "start_date": "2020-01-01",
    "start_time": "07:00"
}

Einige Anmerkungen zur Antwort:

start_date

Datum, an dem der Kalender öffnet.

start_time

Tageszeit (dänische Zeit), zu der der Kalender öffnet — also ab wann Buchungen vorgenommen werden können.

end_date

Datum, an dem der Kalender schließt.

end_time

Tageszeit (dänische Zeit), zu der der Kalender schließt — also bis wann Buchungen vorgenommen werden können.

selected_days

1 entspricht Montag, 2 entspricht Dienstag usw. Dieser Kalender ist also die ganze Woche für Buchungen geöffnet. Und er ist von 07:00–23:00 Uhr geöffnet.

rule_max_days_ahead

Dies ist eine Regel, die besagt, dass maximal 14 Tage im Voraus gebucht werden kann. Diese Regel wird über API-Aufrufe nicht durchgesetzt, sondern nur, wenn Mitglieder direkt über das Mitgliederportal des Vereins buchen.

close_days

Liste von Daten, an denen der Kalender überhaupt nicht gebucht werden kann. Also „Schließtage“.

Die obigen Informationen — in Kombination mit den eingetragenen Buchungen, die über einen anderen API-Aufruf abgerufen werden können (Buchungsliste) — reichen aus, um freie Zeiten in einem externen System anzuzeigen.