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.
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.
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:
| Netzwerk | Betriebe | mit Website | mit Logo | mit E-Mail | Untergliedert |
|---|---|---|---|---|---|
| Holzclusterpartner | 130 | 112 | 106 | 121 | 8 Kategorien |
| Netzwerk Zirbe | 63 | 61 | 60 | 63 | 10 Kategorien |
| Netzwerkpartner | 23 | 22 | 22 | 20 | — |
| Innovationslandkarte | 20 | 20 | 20 | 20 | — |
| Design in Tirol | 17 | 3 | 4 | 3 | — |
| htt15 — Holzbau Team Tirol | 16 | 13 | 12 | 16 | — |
| Holzfenster — natürlich aus Tirol | 12 | 11 | 11 | 12 | — |
| Baumstark | 8 | 5 | 5 | 6 | — |
| Netzwerk HolzBauPlanung | 8 | 3 | 3 | 3 | — |
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:
Ein Netzwerk oder eine Branchengruppe — die oberste Gliederungsebene. Holzclusterpartner, Netzwerk Zirbe, Holzbau Team Tirol.
Intern bisher: Branche (oberste Ebene)Eine Untergruppe innerhalb eines Netzwerks — bei den Holzclusterpartnern etwa Forstwirtschaft, Holzhandel, Zimmereien. Nicht jedes Netzwerk ist untergliedert.
Intern bisher: UnterbrancheDie 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: BranchenzuordnungDer 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:
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.
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": [ … ]
}
]
}
Ein einzelnes Netzwerk mit seinen Kategorien.
Betriebe eines Netzwerks
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
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.
| Parameter | Wirkung |
|---|---|
network | Auf ein oder mehrere Netzwerke einschränken. Mehrfach angebbar. |
category | Auf Kategorien innerhalb der Netzwerke einschränken. Mehrfach angebbar. |
q | Volltextsuche über Name, Ort und Postleitzahl. Mindestens zwei Zeichen. |
hasHomepage | Nur Betriebe mit veröffentlichter Website. |
bbox | Kartenausschnitt als minLng,minLat,maxLng,maxLat. |
fields | Auf die benötigten Felder reduzieren. |
page, perPage | Seitenweiser 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
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.
Das Firmenlogo. Steht im Feld logoUrl des Betriebs.
Redaktionelle Bilder — Galeriebild, Foto eines Ansprechpartners, Bild zu einer
Innovation. Das Präfix der Kennung zeigt die Herkunft: ba- Galerie,
ct- Ansprechpartner, in- Innovation.
| Parameter | Werte | Wirkung |
|---|---|---|
w | 1–2000 | Zielbreite in Pixeln. |
h | 1–2000 | Zielhöhe in Pixeln. |
fit | contain · 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. |
format | auto · 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
| Feld | Typ | Befüllung | Anmerkung |
|---|---|---|---|
id | Zahl | vollständig | Stabil über die Zeit. |
name | Text | vollständig | |
street | Text | vollständig | |
zipcode | Text | vollständig | Als Text, führende Nullen bleiben erhalten. |
city | Text | vollständig | |
country | Text | vollständig | Ausgeschrieben, deutsch. |
latitude | Zahl | vollständig | Alle Betriebe sind geokodiert. |
longitude | Zahl | vollständig | |
homepage | Text | hoch | Ohne Protokoll, für die Anzeige. |
homepageUrl | Text | hoch | Vollständige URL, für das href. |
email | Text | hoch | Nur bei Freigabe durch den Betrieb. |
phone | Text | hoch | Nur bei Freigabe. |
logoUrl | Text | hoch | Nur bei Freigabe. Größenparameter anhängbar. |
trainees | Ja/Nein | gering | Lehrbetrieb, nur bei Freigabe. |
description | HTML | gering | Derzeit nur zwei Betriebe im Gesamtbestand. |
innovations | Liste | gering | 13 Betriebe, im Wesentlichen die Innovationslandkarte. |
numberEmployees | Zahl | leer | Kein Betrieb hat die Veröffentlichung freigegeben. |
memberships | Liste | vollständig | Mindestens ein Eintrag je Betrieb. |
Netzwerkzugehörigkeit
| Feld | Typ | Befüllung | Anmerkung |
|---|---|---|---|
networkId | Zahl | vollständig | |
networkName | Text | vollständig | Mitgeliefert, damit kein zweiter Abruf nötig ist. |
categoryId | Zahl | hoch | null bei nicht untergliederten Netzwerken. |
categoryName | Text | hoch | |
contactName | Text | gering | Zirbe 7 von 63, Holzcluster 10 von 130. |
contactFunction | Text | gering | Wo Ansprechpartner gepflegt ist. |
contactStatement | HTML | gering | Zitat des Ansprechpartners. |
contactImageUrl | Text | gering | Porträtfoto, Größenparameter anhängbar. |
description | HTML | gering | Rund 100 Zuordnungen im Gesamtbestand. |
entryDate | Datum | gering | Beitrittsdatum, nur bei Freigabe. |
images | Liste | gering | Bildergalerie 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."
}
}
| Status | Bedeutung | Zu tun |
|---|---|---|
| 400 | Ein Parameter ist ungültig. | Die Meldung nennt den betroffenen Parameter. |
| 401 | Schlüssel fehlt oder ist ungültig. | Header X-API-Key prüfen. |
| 404 | Die Ressource existiert nicht. | Auch bei gelöschten Betrieben. |
| 429 | Zu viele Anfragen. | Der Header Retry-After nennt die Wartezeit. |
| 500 | Fehler 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:
- 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.
- 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.
- 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.