Dieser Artikel beschreibt die Schnittstelle (API) der Homepage-Integration im Detail. Er richtet sich an Entwickler und Agenturen, die petoffice-Anzeigen in eine Homepage einbinden, die nicht auf WordPress basiert, oder die volle Kontrolle über die Darstellung übernehmen möchten. Wenn du eine WordPress-Seite betreibst, brauchst du diese Seite in der Regel nicht. Nutze stattdessen das fertige WordPress-Plugin.

Adresse und Vereinszuordnung

Alle Endpunkte sind vereinsspezifisch. Der Verein wird nicht über einen Parameter übergeben, sondern automatisch aus dem Hostnamen der angefragten Adresse abgeleitet. Maßgeblich ist deine vereinsspezifische Homepage-Domain, die du in petoffice unter Einstellungen → Homepage-Integration im Abschnitt „Domain” findest.

Die Endpunkte liegen unterhalb dieser Domain im Pfad /new-api/homepage/. Alle folgenden Beispiele gehen von einem Verein mit der Homepage-Domain https://beispielverein.petoffice.app aus, der eigentlichen Vereinshomepage unter https://www.beispielverein.de und einer Beispiel-Anzeige mit der ID 6a1f10833723359afd2fb293.

Fertiges HTML und Rohdaten

Die Schnittstelle zwingt dich nicht in einen Modus. Beim Profil einer Anzeige liefert eine einzige Antwort gleichzeitig beides: die fertig aufbereiteten HTML-Bausteine und die zugehörigen Rohdaten unter data. Du entscheidest pro Feld, was du verwendest, und kannst beide Darstellungsformen auch mischen.

Die HTML-Bausteine sind einsatzfertig: Titel, Bildergalerie, Videogalerie und so weiter. Sie enthalten die nötige Grundstruktur, schlanke Layout-Stile und bei den Galerien das vanilla-JavaScript für die Lightbox. Über die mitgelieferten CSS-Klassen (Präfix po-) überschreibst du die Darstellung in deinem eigenen Stylesheet. Diese Bausteine sind auch die Grundlage des WordPress-Plugins.

Die Rohdaten enthalten die reinen Werte einer Anzeige ohne Markup. Mit ihnen baust du die Oberfläche vollständig selbst, wenn du das Layout exakt an dein bestehendes Design anpassen willst.

Bei der Tierliste gibt es für diese beiden Darstellungsformen jeweils einen eigenen Endpunkt (siehe unten): einen, der die fertige Listen-HTML liefert, und einen, der nur die Daten zurückgibt.

Endpunkte

Alle Endpunkte sind über GET erreichbar. Jeder Abschnitt folgt demselben Aufbau: Beschreibung, URL-Format mit Platzhaltern, ein vollständig ausgefülltes Beispiel, die Parameter mit gültigen Beispielwerten und die Antwort. {domain} steht dabei für die Homepage-Domain.

Tierliste als HTML

Liefert die fertig gerenderte Tierliste als HTML-Baustein, verpackt in ein JSON-Objekt.

URL-Format

GET {domain}/new-api/homepage/pet-list/{tierart}/{sortBy}/{sortOrder}

Beispiel

GET https://beispielverein.petoffice.app/new-api/homepage/pet-list/Katze/title/asc?detailsPageUrl=https://www.beispielverein.de/tierprofil/&listPageUrl=https://www.beispielverein.de/tiere/&selectedTag=Notfellchen&showTags=true

Pfad-Parameter

ParameterMögliche WerteBeispielwertBeschreibung
tierartAnzeigename einer aktiven TierartKatzeMuss exakt dem Anzeigenamen einer aktiven Tierart des Vereins entsprechen (sonst Fehler 400).
sortBytitle, species, createdAttitleSortierfeld: title (Name), species (Tierart) oder createdAt (Anlagedatum). Andere Werte werden ignoriert, dann gilt die Standardreihenfolge.
sortOrderasc, descascSortierrichtung: asc (aufsteigend) oder desc (absteigend).

Query-Parameter

ParameterPflichtBeispielwertBeschreibung
detailsPageUrlempfohlenhttps://www.beispielverein.de/tierprofil/Adresse der Profilseite; die Anzeigen-ID wird direkt angehängt.
listPageUrlempfohlenhttps://www.beispielverein.de/tiere/Adresse der aktuellen Listenseite, für die Tag-Links.
selectedTagoptionalNotfellchenSchränkt die Liste auf einen Tag ein. Der Wert muss einem vorhandenen Tag entsprechen (siehe tags in der Antwort der Rohdaten-Liste).
showTagsoptionaltrueNur der Wert true blendet die anklickbaren Tag-Filter ein. Jeder andere Wert (oder Weglassen) blendet sie aus.

Antwort

{ "list": "<div class="po-pet-list">…</div>" }

Tierliste als HTML (unverpackt)

Liefert dasselbe HTML wie der vorige Endpunkt, jedoch direkt als Zeichenkette statt in ein { "list": … }-Objekt verpackt. Trotz des Suffix /raw handelt es sich um fertiges HTML, nicht um Rohdaten.

URL-Format

GET {domain}/new-api/homepage/pet-list/{tierart}/{sortBy}/{sortOrder}/raw

Beispiel

GET https://beispielverein.petoffice.app/new-api/homepage/pet-list/Katze/title/asc/raw?detailsPageUrl=https://www.beispielverein.de/tierprofil/&listPageUrl=https://www.beispielverein.de/tiere/&showTags=true

Pfad- und Query-Parameter

Identisch zum Endpunkt Tierliste als HTML.

Antwort

<div class="po-pet-list">…</div>

Tierliste als Rohdaten

Liefert ausschließlich die Daten der Liste ohne Markup, samt der Liste aller verfügbaren Tags.

URL-Format

GET {domain}/new-api/homepage/pet-list

Beispiel

GET https://beispielverein.petoffice.app/new-api/homepage/pet-list?species=Katze&sortBy=title&sortOrder=asc&tag=Notfellchen

Query-Parameter

ParameterPflichtMögliche WerteBeispielwertBeschreibung
speciesoptionalAnzeigename einer aktiven TierartKatzeMuss exakt dem Anzeigenamen einer aktiven Tierart des Vereins entsprechen (sonst Fehler 400).
sortByoptionaltitle, species, createdAttitleSortierfeld: title (Name), species (Tierart) oder createdAt (Anlagedatum). Andere Werte werden ignoriert.
sortOrderoptionalasc, descascSortierrichtung: asc (aufsteigend) oder desc (absteigend).
tagoptionalvorhandener TagNotfellchenSchränkt die Liste auf einen Tag ein (siehe tags in der Antwort).

Antwort

{ "pets": [], "tags": [] }

Jeder Eintrag in pets folgt dem Datenschema der Rohdaten.

Tierprofil

Liefert das vollständige Tierprofil einer Anzeige: alle gerenderten HTML-Bausteine und zusätzlich die Rohdaten unter data.

URL-Format

GET {domain}/new-api/homepage/pet-details/{id}

Beispiel

GET https://beispielverein.petoffice.app/new-api/homepage/pet-details/6a1f10833723359afd2fb293

Pfad-Parameter

ParameterBeispielwertBeschreibung
id6a1f10833723359afd2fb293ID der Anzeige.

Antwort

{
  "applyButton": "<div class="po-pet-profile__application-button">…</div>",
  "description": "<div class="po-pet-profile__description">…</div>",
  "extra": "<div class="po-pet-extra">…</div>",
  "gallery": "<div class="po-image-gallery">…</div>",
  "image": "<div class="po-pet-profile__image">…</div>",
  "title": "<div class="po-pet-profile__title">…</div>",
  "videos": "<div class="po-video-gallery">…</div>",
  "data": {}
}

Der Baustein extra gibt die Zusatzfelder als Tabelle aus: leere Werte werden weggelassen, bekannte Feldnamen als Beschriftung verwendet, Datumswerte formatiert und Ja/Nein-Felder als Ja oder Nein dargestellt. Das Feld data.extra bleibt dagegen eine unformatierte Zuordnung von Feld-Kürzel zu Rohwert. Das Feld data folgt dem Datenschema der Rohdaten.

Datenschema der Rohdaten

Das Feld data (sowie jeder Eintrag in pets) verwendet folgendes Schema:

FeldTypBedeutung
idstringID der Anzeige.
speciesstring \| nullTierart.
titlestring \| nullÖffentlicher Titel.
reservedboolean \| nullOb das Tier als reserviert markiert ist.
inGermanyboolean \| nullOb sich das Tier in Deutschland befindet.
imageIdstring \| nullID des Hauptbilds.
tagsstring[]Öffentliche Tags für die Filterung.
imageIdsstring[]Alle öffentlichen Bild-IDs der Galerie.
youtubeIdsstring[]IDs der YouTube-Videos.
prospectUrlstring \| nullPfad zum Bewerbungsformular.
publicHeadlinestring \| nullOptionale Überschrift.
publicDescriptionstring \| nullÖffentlicher Beschreibungstext.
extraRecord<string, value>Rohwerte der Zusatzfelder, je Feld-Kürzel.

CSS-Klassen

Alle ausgegebenen Klassen tragen das Präfix po-. Über sie passt du das Aussehen an, ohne dass dich künftige Updates aus dem Tritt bringen.

Tierliste

KlasseZweck
po-pet-listUmfassung der Tierliste.
po-petEin einzelnes Tier in der Liste.
po-pet__linkLink zur Profilseite.
po-pet__reservedReserviert-Hinweis.
po-pet__imageVorschaubild.
po-pet__titleTitel des Tieres.
po-pet-filtersUmfassung der Tag-Filter.
po-pet-filters__tagsContainer der Filter-Links.
po-pet-filters__tagEin einzelner Tag-Filter.

Profil-Bausteine

KlasseZweck
po-pet-profile__titleTitel-Baustein.
po-pet-profile__imageHauptbild-Baustein.
po-pet-profile__descriptionBeschreibungs-Baustein.
po-pet-profile__application-buttonBaustein für den Bewerbungs-Button.
po-pet-profile__application-linkDer Bewerbungs-Link selbst.

Zusatzfelder

KlasseZweck
po-pet-extraUmfassung der Zusatzfelder.
po-pet-extra__tableTabelle der Felder.
po-pet-extra__rowEine Feldzeile.
po-pet-extra__keyFeldbeschriftung.
po-pet-extra__valueFormatierter Wert.

Galerien

KlasseZweck
po-image-galleryUmfassung der Bildergalerie.
po-image-gallery__buttonKlickfläche eines Bildes.
po-image-gallery__thumbnailVorschaubild.
po-video-galleryUmfassung der Videogalerie.
po-video-gallery__buttonKlickfläche eines Videos.
po-video-gallery__thumbnailVideo-Vorschaubild.
po-video-gallery__playAbspiel-Symbol.

Bild- und Videogalerie teilen sich eine gemeinsame Lightbox. Deren Gestaltungspunkte tragen das Präfix po-homepage-lightbox, zum Beispiel po-homepage-lightbox, po-homepage-lightbox--open, po-homepage-lightbox__media, po-homepage-lightbox__close und po-homepage-lightbox__nav.

Häufige Fragen

Brauche ich eine Authentifizierung, um die Schnittstelle aufzurufen?
Nein. Die über die Schnittstelle ausgelieferten Daten sind genau die Inhalte, die ihr ohnehin bewusst auf eurer Homepage veröffentlicht (Anzeigen mit gesetztem Häkchen „Homepage”). Da diese Inhalte öffentlich zugänglich sein sollen, ist keine Authentifizierung erforderlich.

Hinweise zur Einbindung

Die Galerie-Bausteine enthalten neben dem Markup auch das JavaScript und die data-po-*-Attribute, die für die Lightbox nötig sind. Wenn du die fertigen HTML-Bausteine direkt einsetzt, dürfen Skripte, data-po-*-Attribute und das hidden-Attribut nicht entfernt werden. Entfernt dein System diese Bestandteile, binde stattdessen eigene, vertrauenswürdige Skripte und Stile ein und nutze die po--Klassen als stabile Ankerpunkte. Für volle Kontrolle über die Darstellung verwende die Rohdaten und baue die Oberfläche selbst.