Schnittstellenbeschreibung

Netzwerk- und Unternehmensdaten

Die Unternehmenskooperationen von ProHolz Tirol — Cluster, Netzwerke und Branchengruppen samt der zugehörigen Betriebe — als lesende Schnittstelle für die Einbindung in eine externe Website.

Entwurf zur Abstimmung Version 1.0.0-draft Stand 22.08.2026 MINDSTREAM GmbH

Wozu diese Schnittstelle

ProHolz Tirol pflegt seit Jahrzehnten eine Unternehmensdatenbank. Darin sind die Betriebe nicht nur erfasst, sondern auch den Kooperationen zugeordnet, die ProHolz betreut — dem Holzcluster, dem Netzwerk Zirbe, dem Holzbau Team Tirol und weiteren. Diese Zuordnungen sind der Kern dessen, was auf der Website sichtbar werden soll.

Die Schnittstelle stellt diese Daten bereit. Sie ist die Grenze zwischen den beiden Aufgabenbereichen: ProHolz und MINDSTREAM verantworten die Daten und ihre Bereitstellung, die Website-Seite verantwortet Darstellung, Navigation, Filterung und Gestaltung vollständig eigenständig.

Was das praktisch bedeutet

Die Schnittstelle liefert bewusst mehr Felder, als eine konkrete Darstellung braucht. Was davon angezeigt wird — ob Logos, ob Beschreibungstexte, ob Ansprechpartner — entscheidet allein die Website. Umgekehrt gilt: was hier nicht dokumentiert ist, sollte auch nicht verwendet werden, damit spätere Änderungen an den internen Systemen nichts zerbrechen.

Die Schnittstelle ist ausschließlich lesend. Die Datenpflege bleibt unverändert in den bestehenden ProHolz-Systemen — es entsteht keine zweite Stelle, an der Daten gepflegt werden müssten.

Was in den Daten steckt

Zum Stand dieser Beschreibung enthält die Datenbank folgende Bestände. Die Zahlen sind nützlich, um den Zuschnitt der Darstellung abzuschätzen.

16
Netzwerke und Branchengruppen
2.700
Unternehmen gesamt
100 %
davon geokodiert
3.154
Netzwerkzugehörigkeiten

Die 2.700 Unternehmen sind der Gesamtbestand, überwiegend aus dem Abgleich mit der Wirtschaftskammer. Für die Darstellung auf der Website sind die kuratierten Netzwerke relevant — sie sind deutlich kleiner und dafür wesentlich besser gepflegt:

NetzwerkBetriebemit Website mit Logomit E-MailUntergliedert
Holzclusterpartner1301121061218 Kategorien
Netzwerk Zirbe6361606310 Kategorien
Netzwerkpartner23222220
Innovationslandkarte20202020
Design in Tirol17343
htt15 — Holzbau Team Tirol16131216
Holzfenster — natürlich aus Tirol12111112
Baumstark8556
Netzwerk HolzBauPlanung8333

Daneben bestehen die fachlichen Gruppen aus dem Kammerabgleich — Tischler und holzgestaltende Gewerbe, Holzbau, Holzindustrie, Handel, Gewerbliche Dienstleister, Kunsthandwerke, Papierindustrie. Sie umfassen den Großteil der 2.700 Betriebe, enthalten aber fast nur Name, Adresse und Koordinaten.

Zwei Netzwerke fallen ab

Design in Tirol (3 von 17 Betrieben mit Website) und Netzwerk HolzBauPlanung (3 von 8) sind deutlich lückenhafter als die übrigen. Wenn die Darstellung im Wesentlichen auf die Firmenwebsites weiterleiten soll, sollten diese beiden vor der Veröffentlichung redaktionell nachgezogen werden.

Begriffe

In den ProHolz-Systemen sind über die Jahre verschiedene Bezeichnungen für dieselben Dinge entstanden. Damit alle Beteiligten dasselbe meinen, verwendet die Schnittstelle durchgehend diese drei Begriffe:

network

Ein Netzwerk oder eine Branchengruppe — die oberste Gliederungsebene. Holzclusterpartner, Netzwerk Zirbe, Holzbau Team Tirol.

Intern bisher: Branche (oberste Ebene)
category

Eine Untergruppe innerhalb eines Netzwerks — bei den Holzclusterpartnern etwa Forstwirtschaft, Holzhandel, Zimmereien. Nicht jedes Netzwerk ist untergliedert.

Intern bisher: Unterbranche
membership

Die Zugehörigkeit eines Betriebs zu einem Netzwerk. Trägt die netzwerkspezifischen Inhalte: Beitrittsdatum, Ansprechpartner, Zitat, Bildergalerie. Ein Betrieb kann in mehreren Netzwerken vertreten sein — und dort jeweils unterschiedlich dargestellt werden.

Intern bisher: Branchenzuordnung

Der dritte Begriff ist der wichtigste für die Gestaltung: Ansprechpartner, Zitat und Bilder hängen nicht am Betrieb, sondern an seiner Zugehörigkeit zu einem bestimmten Netzwerk. Dieselbe Tischlerei kann im Netzwerk Zirbe mit einem anderen Gesicht und einem anderen Statement auftreten als bei den Holzclusterpartnern.

Herkunft und Aktualität

Die Daten stammen aus zwei Quellen, die bereits heute zusammenlaufen:

  • Stammdaten — Name, Adresse, Kontakt, Koordinaten, Netzwerkzuordnungen — kommen aus der zentralen ProHolz-Datenbank, in der Simon und das Team pflegen.
  • Redaktionelle Inhalte — Beschreibungstexte, Ansprechpartner, Zitate, Bildergalerien, Innovationen — werden separat gepflegt und den Stammdaten zugeordnet.

Die Schnittstelle liefert beides zusammengeführt. Jede Antwort enthält im Feld syncedAt den Zeitpunkt, zu dem die Stammdaten zuletzt übernommen wurden.

Aktualität: bis zu eine Stunde Verzögerung

Die Übernahme der Stammdaten läuft stündlich. Wird ein Betrieb in der ProHolz-Datenbank einem Netzwerk zugeordnet, erscheint er also nicht sofort auf der Website, sondern innerhalb der nächsten Stunde. Redaktionelle Inhalte sind unmittelbar wirksam.

Für den Regelfall — ein Betrieb tritt einem Netzwerk bei — ist das unkritisch. Nur wenn eine Veröffentlichung auf die Minute geplant ist, muss dieser Versatz mitgedacht werden.

Ein neu angelegtes Netzwerk erscheint auf demselben Weg. Wird die Navigation der Website aus /networks aufgebaut, ist dafür keine Änderung am Website-Code nötig — das Netzwerk taucht auf, sobald es in der Datenbank existiert und Betriebe zugeordnet sind.

Authentifizierung

Jeder Konsument erhält einen eigenen Schlüssel, der bei jedem Aufruf im Header X-API-Key mitgeschickt wird.

# Beispielaufruf
curl -H "X-API-Key: <Ihr Schlüssel>" \
     "https://wms.proholz-tirol.at/api/v1/networks"

Getrennte Schlüssel je Konsument haben zwei praktische Gründe: ein Schlüssel lässt sich einzeln tauschen, ohne andere Anbindungen zu stören, und in den Zugriffsprotokollen ist nachvollziehbar, welches System welche Last erzeugt.

Bildabrufe unter /media/ brauchen keinen Schlüssel. Anders ließen sich die Bild-URLs nicht direkt in img-Tags verwenden. Die Bild-URLs sind nicht erratbar-fortlaufend gestaltet, und es sind ohnehin genau die Bilder, die öffentlich angezeigt werden sollen.

Konventionen

Alle Endpunkte antworten mit JSON in UTF-8. Der Basispfad lautet:

https://wms.proholz-tirol.at/api/v1

Jede Antwort ist ein Objekt mit den Nutzdaten unter data. Listen enthalten zusätzlich pagination, alle Antworten syncedAt:

{
  "syncedAt": "2026-08-22T09:00:00+02:00",
  "pagination": { "page": 1, "perPage": 100, "total": 63, "totalPages": 1 },
  "data": [ … ]
}

Felder ohne Wert werden als null geliefert, nicht weggelassen — die Struktur einer Antwort ist damit unabhängig vom Füllstand des einzelnen Datensatzes.

Textfelder, die redaktionell erfasst wurden, enthalten HTML (Absätze, Listen, Links). Sie sind serverseitig aus einer vereinfachten Auszeichnungssprache erzeugt und können unverändert ausgegeben werden. Betroffen sind description beim Betrieb sowie description und contactStatement bei der Netzwerkzugehörigkeit.

Listen sind seitenweise abrufbar über page und perPage (Standard 100, Maximum 500). Mit fields lässt sich die Antwort auf die tatsächlich benötigten Felder eindampfen, was bei Listenansichten spürbar Datenvolumen spart:

/companies?network=55&fields=id,name,city,logoUrl,homepageUrl

Maschinenlesbare Fassung

Diese Beschreibung liegt zusätzlich als OpenAPI-3.1-Datei vor:

openapi.yaml

Damit lassen sich die Endpunkte in Werkzeuge wie Postman oder Insomnia importieren und Clients generieren. Die Datei hat denselben Stand wie diese Seite.

Eine interaktive Oberfläche zum Ausprobieren der Aufrufe folgt, sobald die Schnittstelle tatsächlich erreichbar ist. Solange sie nur beschrieben ist, hätte ein Testaufruf nichts, wogegen er laufen könnte.

Endpunkte

Sieben Endpunkte, alle lesend. Der erste ist der empfohlene Einstiegspunkt.

GET/networks

Alle Netzwerke mit ihren Kategorien und der jeweiligen Anzahl zugeordneter Betriebe.

Wird die Navigation aus dieser Antwort aufgebaut, erscheinen neue Netzwerke automatisch. Netzwerke ohne Betriebe werden standardmäßig ausgeblendet; ?includeEmpty=true liefert auch sie.

{
  "syncedAt": "2026-08-22T09:00:00+02:00",
  "data": [
    {
      "id": 55,
      "name": "Holzclusterpartner",
      "companyCount": 130,
      "categories": [
        { "id": 56, "name": "Forstwirtschaft", "companyCount": 9 },
        { "id": 59, "name": "Zimmereien",     "companyCount": 24 }
      ]
    },
    {
      "id": 69,
      "name": "Netzwerk Zirbe",
      "companyCount": 63,
      "categories": [ … ]
    }
  ]
}
GET/networks/{networkId}

Ein einzelnes Netzwerk mit seinen Kategorien.

Betriebe eines Netzwerks

GET/networks/{networkId}/companies

Alle Betriebe des Netzwerks, einschließlich aller seiner Kategorien. Der Regelfall für eine Netzwerk-Übersichtsseite.

Gleichwertig zu /companies?network={networkId} und akzeptiert dieselben Filter.

# Alle Zirbe-Betriebe, auf Listenfelder reduziert
/networks/69/companies?fields=id,name,city,logoUrl,homepageUrl

# Nur die Zimmereien im Holzcluster
/networks/55/companies?category=59

Betriebe suchen

GET/companies

Betriebe mit freier Filterung. Ohne Filter der Gesamtbestand — rund 2.700 Datensätze und etwa 2 MB. Für Netzwerkdarstellungen ist der Filter network erheblich sparsamer.

ParameterWirkung
networkAuf ein oder mehrere Netzwerke einschränken. Mehrfach angebbar.
categoryAuf Kategorien innerhalb der Netzwerke einschränken. Mehrfach angebbar.
qVolltextsuche über Name, Ort und Postleitzahl. Mindestens zwei Zeichen.
hasHomepageNur Betriebe mit veröffentlichter Website.
bboxKartenausschnitt als minLng,minLat,maxLng,maxLat.
fieldsAuf die benötigten Felder reduzieren.
page, perPageSeitenweiser Abruf. Standard 100, Maximum 500.
# Zirbe-Betriebe mit Website, im Kartenausschnitt Tirol
/companies?network=69&hasHomepage=true&bbox=10.0,46.6,13.0,47.8

# Suche über zwei Netzwerke hinweg
/companies?network=55&network=69&q=Zimmerei

Ein Betrieb im Detail

GET/companies/{companyId}

Ein Betrieb mit allen Detaildaten, einschließlich der redaktionellen Inhalte je Netzwerkzugehörigkeit.

{
  "syncedAt": "2026-08-22T09:00:00+02:00",
  "data": {
    "id": 491,
    "name": "Feldkircher GmbH",
    "description": "<p>In unserer Manufaktur entstehen …</p>",
    "street": "Dr. Walter-Zumtobel-Straße 3",
    "zipcode": "6850",
    "city": "Dornbirn",
    "country": "Österreich",
    "latitude": 47.433591,
    "longitude": 9.746341,
    "phone": "+43 5572 58356",
    "email": "info@hubert-feldkircher.at",
    "homepage": "www.hubert-feldkircher.at",
    "homepageUrl": "http://www.hubert-feldkircher.at",
    "logoUrl": "https://wms.proholz-tirol.at/api/v1/media/logo/19163",
    "numberEmployees": null,
    "trainees": false,
    "memberships": [
      {
        "id": 2617,
        "networkId": 69,
        "networkName": "Netzwerk Zirbe",
        "categoryId": 73,
        "categoryName": "Tischler & Innenraumgestaltung",
        "entryDate": null,
        "description": null,
        "contactName": "Hubert Feldkircher",
        "contactFunction": "Geschäftsinhaber und Tischlermeister",
        "contactStatement": "<p>Massivholzmöbel, versehen mit …</p>",
        "contactImageUrl": "…/api/v1/media/photo/ct-2617",
        "images": [
          { "id": "ba-102", "url": "…/api/v1/media/photo/ba-102",
            "title": null, "copyright": null }
        ]
      }
    ],
    "innovations": []
  }
}

Bilder

Alle Bild-URLs stehen fertig und vollständig in den Datensätzen — sie müssen nicht selbst zusammengesetzt werden. An jede dieser URLs lassen sich Parameter zur Größenanpassung anhängen.

GET/media/logo/{companyId}

Das Firmenlogo. Steht im Feld logoUrl des Betriebs.

GET/media/photo/{photoId}

Redaktionelle Bilder — Galeriebild, Foto eines Ansprechpartners, Bild zu einer Innovation. Das Präfix der Kennung zeigt die Herkunft: ba- Galerie, ct- Ansprechpartner, in- Innovation.

ParameterWerteWirkung
w1–2000Zielbreite in Pixeln.
h1–2000Zielhöhe in Pixeln.
fitcontain · cover contain behält das Seitenverhältnis und beschneidet nicht — richtig für Logos. cover füllt die Fläche und beschneidet dafür — richtig für Bildkacheln in einem Raster.
formatauto · jpeg · png · webp auto liefert WebP, wenn der Browser es akzeptiert.
<!-- Logo, auf 240 px Breite, ohne Beschnitt -->
<img src="…/api/v1/media/logo/19163?w=240" alt="Feldkircher GmbH">

<!-- Galeriebild als quadratische Kachel -->
<img src="…/api/v1/media/photo/ba-102?w=600&h=600&fit=cover" alt="">

Skalierte Fassungen werden serverseitig zwischengespeichert. Der erste Abruf einer neuen Größe dauert daher etwas länger als die folgenden.

Bildrechte

Galeriebilder können im Feld copyright einen Rechtehinweis tragen. Wo er gesetzt ist, muss er bei der Anzeige ausgewiesen werden.

Feldkatalog

Alle Felder eines Betriebs, mit ihrem tatsächlichen Befüllungsgrad. Die Angaben beziehen sich auf die kuratierten Netzwerke, nicht auf den Gesamtbestand — dort liegen die Werte durchweg niedriger.

Der Befüllungsgrad ist der praktisch wichtigste Teil dieser Beschreibung: mehrere Felder existieren technisch, sind aber redaktionell leer. Eine Gestaltung, die auf ihnen aufbaut, würde derzeit ins Leere laufen.

Betrieb

FeldTypBefüllungAnmerkung
idZahlvollständigStabil über die Zeit.
nameTextvollständig
streetTextvollständig
zipcodeTextvollständigAls Text, führende Nullen bleiben erhalten.
cityTextvollständig
countryTextvollständigAusgeschrieben, deutsch.
latitudeZahlvollständigAlle Betriebe sind geokodiert.
longitudeZahlvollständig
homepageTexthochOhne Protokoll, für die Anzeige.
homepageUrlTexthochVollständige URL, für das href.
emailTexthochNur bei Freigabe durch den Betrieb.
phoneTexthochNur bei Freigabe.
logoUrlTexthochNur bei Freigabe. Größenparameter anhängbar.
traineesJa/NeingeringLehrbetrieb, nur bei Freigabe.
descriptionHTMLgeringDerzeit nur zwei Betriebe im Gesamtbestand.
innovationsListegering13 Betriebe, im Wesentlichen die Innovationslandkarte.
numberEmployeesZahlleerKein Betrieb hat die Veröffentlichung freigegeben.
membershipsListevollständigMindestens ein Eintrag je Betrieb.

Netzwerkzugehörigkeit

FeldTypBefüllungAnmerkung
networkIdZahlvollständig
networkNameTextvollständigMitgeliefert, damit kein zweiter Abruf nötig ist.
categoryIdZahlhochnull bei nicht untergliederten Netzwerken.
categoryNameTexthoch
contactNameTextgeringZirbe 7 von 63, Holzcluster 10 von 130.
contactFunctionTextgeringWo Ansprechpartner gepflegt ist.
contactStatementHTMLgeringZitat des Ansprechpartners.
contactImageUrlTextgeringPorträtfoto, Größenparameter anhängbar.
descriptionHTMLgeringRund 100 Zuordnungen im Gesamtbestand.
entryDateDatumgeringBeitrittsdatum, nur bei Freigabe.
imagesListegeringBildergalerie zu dieser Zugehörigkeit.

Freigaben wirken feldweise

Kontaktdaten, Logo, Lehrbetriebs-Kennzeichnung und Beitrittsdatum unterliegen jeweils einer eigenen Freigabe durch den Betrieb. Fehlt sie, liefert die Schnittstelle null — der Datensatz selbst bleibt aber sichtbar. Die Darstellung muss also damit rechnen, dass einzelne Angaben fehlen, auch wenn der Betrieb gepflegt ist.

Fehler

Fehler kommen als JSON mit passendem HTTP-Status:

{
  "error": {
    "code": "invalid_parameter",
    "message": "Parameter 'bbox' ist nicht im Format minLng,minLat,maxLng,maxLat."
  }
}
StatusBedeutungZu tun
400Ein Parameter ist ungültig.Die Meldung nennt den betroffenen Parameter.
401Schlüssel fehlt oder ist ungültig.Header X-API-Key prüfen.
404Die Ressource existiert nicht.Auch bei gelöschten Betrieben.
429Zu viele Anfragen.Der Header Retry-After nennt die Wartezeit.
500Fehler auf Serverseite.Wiederholen; bei Dauer bitte melden.

Das Anfragelimit ist großzügig bemessen und wird bei üblicher Nutzung — auch bei serverseitigem Zwischenspeichern der Antworten — nicht erreicht.

Anhang: die bestehenden Schnittstellen

Dieser Abschnitt dient der Einordnung und beschreibt, was heute in Betrieb ist. Für die Anbindung der neuen Website ist er nicht erforderlich.

Die bestehende Darstellung stammt aus zwei Generationen. Die Kartenanwendung von 2012 wurde später durch eine überarbeitete Fassung abgelöst, die bis heute läuft und als eingebetteter Rahmen in die Website eingebunden ist. Sie versorgt sich aus einer älteren Schnittstelle derselben Datenbasis.

Diese bestehenden Zugänge bleiben unverändert bestehen. Die hier beschriebene Schnittstelle ist bewusst getrennt davon aufgebaut — so kann die neue Website entwickelt werden, ohne die laufenden Einbindungen zu berühren, und Erweiterungen für die neue Website können vorgenommen werden, ohne den Bestand zu gefährden.

Zwei Unterschiede zum Bestand sind erwähnenswert, weil sie dort Reibung erzeugt haben:

  • Vollständige Bild-URLs. Im Bestand werden Logo-Adressen unvollständig ausgeliefert und müssen vom Empfänger ergänzt werden. Die neue Schnittstelle liefert durchgehend vollständige URLs.
  • Freie Größenanpassung. Im Bestand gibt es vier fest vorgegebene Bildgrößen und für Logos gar keine. Die neue Schnittstelle nimmt Breite, Höhe und Zuschnittverhalten als Parameter entgegen.

Offene Punkte

Drei Punkte sind noch abzustimmen, bevor die Umsetzung beginnt:

  1. Umfang der Darstellung. Ob Logos, Beschreibungstexte und Ansprechpartner angezeigt werden sollen, entscheidet ProHolz intern. Die Schnittstelle liefert alles; die Entscheidung wirkt sich nur auf die Website aus — und darauf, welche redaktionelle Arbeit sich lohnt.
  2. Redaktionelle Nachpflege. Die Beschreibungstexte sind praktisch leer, die Ansprechpartner nur vereinzelt gepflegt. Wenn diese Inhalte Teil der neuen Darstellung sein sollen, ist das ein redaktionelles Vorhaben und kein technisches — die Felder stehen bereit.
  3. Die beiden lückenhaften Netzwerke. Bei Design in Tirol und Netzwerk HolzBauPlanung fehlen überwiegend die Websites der Betriebe.

Rückmeldungen zu dieser Beschreibung — fehlende Felder, zusätzliche Filter, andere Zuschnitte — gerne direkt an MINDSTREAM. Änderungen am Zuschnitt sind zu diesem Zeitpunkt unproblematisch; nach Beginn der Frontend-Arbeit werden sie aufwendiger.